指针拔尖1——(看完包会,不会来打我)

2023-10-08 05:12
文章标签 指针 不会 包会 拔尖

本文主要是介绍指针拔尖1——(看完包会,不会来打我),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言:本章节涵盖——
  • 一、指针变量基础
  • 二、字符指针
  • 三、指针数组和数组指针
  • 拓展:数组名和&数组名的区别
  • 四、 指针传参
  • 总结


前言:本章节涵盖——

1.指针变量基础知识
2.字符指针
3.数组指针
4.指针数组
5.指针传参


一、指针变量基础

本章我们讲前4节
在这里插入图片描述

二、字符指针

代码如下(示例):

#include<iostream>
using namespace std;
int main()
{const char* ps = "hello c++";char arr[] = "hello c++";cout << ps <<endl;//hello c++,为什么会出现这种情况???指针为什么是字符串,而不是地址cout << *ps << endl;//h,解引用就是首元素本身cout << *(ps + 1) << endl;//ecout << *arr << endl;//hcout << arr << endl;//h
}

图例
在这里插入图片描述

为什么会有这种情况?不是说指针存放变量的地址吗?——答案:字符指针指向字符串的地址也指向了字符串本身元素 ,const字符指针是常量
为什么会是字符串?真相只有一个。因为在C语言中,字符串是以字符数组的形式存储的。字符数组由连续的内存空间组成,其中每个元素都存储着字符串中的一个字符。字符指针可以指向字符数组的首地址,也就是字符串的起始位置。当我们通过字符指针访问字符串时,它会从指针指向的内存地址开始连续读取字符,直到遇到字符串的结束标志\0为止。所以字符指针是一种特殊的指针,它可以指向字符数组,又可以指向字符串的地址。
这个是详细解释:总结一句话:"hello c++''就是一个常量。地址比较独特,很难直接获取或者说不允许直接被获取!
下面看一道面试题来巩固提高
在这里插入图片描述
这里str3和str4指向的是一个同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域。当几个指针,指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4不同。

三、指针数组和数组指针

1.指针数组

1.指针数组——顾名思义就是存放指针的数组,可以来打印二维数组
在这里插入图片描述

#include<iostream>
using namespace std;
int main()
{int a[5] = { 1,2,3,4,5 };int b[] = { 2,3,4,5,6 };int c[] = { 3,4,5,6,7 };int* arr[3] = { a,b,c };for (size_t i = 0; i < 3; i++){for (int j = 0;  j < 5;j++){cout << arr[i][j]<<" ";}cout << endl;}
}

在这里插入图片描述

2.数组指针
数组指针是指针,指针指向一个数组的首元素的地址,数组名表示数组首元素的地址

在这里插入图片描述
(示例):int arr[5]={1,2,3,4,5},数组名arr表示数组首元素的地址,
int *p=arr; arr是p等价的了,p和arr操作什么打印什么都相同

既然都说到这里了,接下来我们来共同探究数组名和&数组名的区别

拓展:数组名和&数组名的区别

我先把结论和常常用到的知识点告诉大家!!!
除了sizeoof(arr)和&arr中arr表示的是整个数组
其他时候arr都表示数组首元素的地址
arr表示数组首元素的地址,arr+1表示首元素下个元素的地址
&arr表示整个数组的地址。&arr+1表示跳过整个数组, 最后一个元素后的地址也就是下一个数组首元素的地址
arr和&arr地址大小一样,门牌号一样,但意义不一样

在这里插入图片描述在这里插入图片描述

看看例题:

在这里插入图片描述

#include<iostream>
using namespace std;
//数组指针,指向数组的是指针。int main()
{cout << "1.arr和&arr的区别" << endl;int arr[10] = { 1,2,3,4,5 };int* p1 = arr;//arr为int类型的地址,取出什么样的地址cout << p1 << " "<<arr << endl;//你会发现arr和p1一模一样cout << p1 + 1<<" "<< arr + 1 << endl;int(*p2)[10]= &arr;//取出的是数组的地址double *d[5]={};double* (*pd)[5] = &d;cout << p2 << endl;cout << p2 + 1 << endl;//括号括起来不要让p和[]结合,否则p就是数组的一部分了cout << arr <<" " << &arr << endl;//000000BA42EFFAF8 000000BA42EFFAF8,arr和&arr地址大小一样,门牌号一样,但意义不一样//arr是首元素的地址,&arr是数组的地址cout << arr + 1 <<" " << &arr + 1 << endl;//	000000BA42EFFAFC 000000BA42EFFB20cout <<endl;

在这里插入图片描述

数组指针的应用可以干什么????——打印二维数组,传参的作用,做形式参数

#include<iostream>
using namespace std;
void print(int arr[3][5], int r, int c)
{for (int i = 0; i < 3; i++){for (int j = 0; j < 5; j++) {cout << arr[i][j]<<" ";}cout << endl;}
}//p是一个数组指针——指向一维数组的数组指针
void print2(int (*p)[5],int r,int c)
{for (size_t i = 0; i < r; i++){for (int j = 0; j < c; j++){cout<<*(*(p + i)+j)<<" ";//*(p+i),把二维数组看出一维数组连在一起}cout << endl;}
}cout << "2.数组指针的应用" << endl;int arr1[3][5] = {{1, 2, 3, 4, 5}, { 2,3,4,5,6 }, { 3,4,5,6,7 }};print(arr1, 3, 5);//arr1数组名,二维数组首元素的地址表示第一行的地址!!!cout << "**************" << endl;print2(arr1, 3, 5);return 0;
}

在这里插入图片描述

四、 指针传参

在这里插入图片描述
在这里插入图片描述

总结

提示:这里对文章进行总结:学习了这半章我们知道了,
1.字符指针指向字符串的地址也指向了字符串本身,他是一个比较特殊的存在,并且const修饰字符指针是常量,只有一份存在。

2.数组指针和指针数组——怎么判断?看最里面括号变量和右边的操作符
int*p[10]指针数组, int(*p)[10]数组指针,我们要记住解引用操作符的优先级很低,没有括号直接被孤立。共同的是他们都可以用来打印二维数组。

3.指针传参
参数类型和放回值类型一定要 一 一 对应,
除了sizeoof(arr)和&arr中arr表示的是整个数组**
其他时候arr都表示数组首元素的地址**
一维数组名arr表示数组首元素的地址,&arr表示整个数组的地址
二维数组名arr表示第一行的地址,&arr数组首元素的地址

例如:以上就是今天要讲的内容,多多点赞支持,下半章火速更新

这篇关于指针拔尖1——(看完包会,不会来打我)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/162935

相关文章

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

C和指针:字符串

字符串、字符和字节 字符串基础 字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。 字符串长度就是字符串中字符数。 size_t strlen( char const *string ); string为指针常量(const修饰string),指向的string是常量不能修改。size_t是无符号数,定义在stddef.h。 #include <stddef.h>

【C++】作用域指针、智能指针、共享指针、弱指针

十、智能指针、共享指针 从上篇文章 【C++】如何用C++创建对象,理解作用域、堆栈、内存分配-CSDN博客 中我们知道,你的对象是创建在栈上还是在堆上,最大的区别就是对象的作用域不一样。所以在C++中,一旦程序进入另外一个作用域,那其他作用域的对象就自动销毁了。这种机制有好有坏。我们可以利用这个机制,比如可以自动化我们的代码,像智能指针、作用域锁(scoped_lock)等都是利用了这种机制。

如何保证android程序进程不到万不得已的情况下,不会被结束

最近,做一个调用系统自带相机的那么一个功能,遇到的坑,在此记录一下。 设备:红米note4 问题起因 因为自定义的相机,很难满足客户的所有需要,比如:自拍杆的支持,优化方面等等。这些方面自定义的相机都不比系统自带的好,因为有些系统都是商家定制的,难免会出现一个奇葩的问题。比如:你在这款手机上运行,无任何问题,然而你换一款手机后,问题就出现了。 比如:小米的红米系列,你启用系统自带拍照功能后

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD

C和指针:结构体(struct)和联合(union)

结构体和联合 结构体 结构体包含一些数据成员,每个成员可能具有不同的类型。 数组的元素长度相同,可以通过下标访问(转换为指针)。但是结构体的成员可能长度不同,所以不能用下标来访问它们。成员有自己的名字,可以通过名字访问成员。 结构声明 在声明结构时,必须列出它包含的所有成员。 struct tag {member-list} variable-list ; 定义一个结构体变量x(包含

hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

求满足条件的子数组,一般是前缀和、滑动窗口,经常结合哈希表; 区间操作元素,一般是前缀和、差分数组 数组有序,更大概率会用到二分搜索 目前已经掌握一些基本套路,重零刷起leetcode hot 100, 套路题按套路来,非套路题适当参考gpt解法。 一、梦开始的地方, 两数之和 class Solution:#注意要返回的是数组下标def twoSum(self, nums: Lis

看完这个不会配置 logback ,请你吃瓜!

之前在 日志?聊一聊slf4j吧 这篇文章中聊了下slf4j。本文也从实际的例子出发,针对logback的日志配置进行学习。 logack 简介 logback 官网:https://logback.qos.ch/ 目前还没有看过日志类框架的源码,仅限于如何使用。所以就不说那些“空话”了。最直观的认知是: logback和log4j是一个人写的springboot默认使用的日志框架是

Qt: 详细理解delete与deleteLater (避免访问悬空指针导致程序异常终止)

前言 珍爱生命,远离悬空指针。 正文 delete 立即删除:调用 delete 后,对象会立即被销毁,其内存会立即被释放。调用顺序:对象的析构函数会被立即调用,销毁该对象及其子对象。无事件处理:如果在对象销毁过程中还涉及到信号和槽、事件处理等,直接 delete 可能会导致问题,尤其是在对象正在处理事件时。适用场景:适用于在确定对象已经不再被使用的情况下,并且不涉及异步处理或事件循环中的