一:数组的简介
二:什么是指针数组
三:什么是数组指针
一:数组的简介
为了大家能更好的理解下面指针和数组的关系,先简要的介绍一下数组。
创建一个数组arr,它有10个元素,每个元素的类型是int,当把数组名当做函数参数进行传参时,实际上传递的是首元素的地址,等同于&arr[0];那么就有了疑问,&arr呢?这也表示首元素地址吗?
从上图输出我们可以看到它们的地址都是一样的,也就是说都为首元素地址;接下来试着把每个地址+1,因为数组每个元素类型是int,arr表示首元素地址的话它的类型是int*,指针+1跳过的是4/8个字节,接下来看看结果是否一致
可以看出arr和&arr[0]+1确实是跳过了4个字节,&arr跳过的是十六进制的0x28换算成十进制为整个数组大小40(数组10个元素每个元素int,大小为40),所以&数组名,表示整个数组的地址。
总结得:数组名表示首元素地址,但有两个例外:
1.&数组名,表示整个数组的地址;
2.sizeof (数组名)表示整个数组
二:什么是指针数组
数组是可以通过指针来访问,指针是用来存放地址的。定义个数组arr,当我们把arr赋给一个变量p,那p必须得是一个指针类型才能存放地址;*表示p是一个指针,int是因为数组是int型所以p也得是int。
一个地址需要一个指针变量存放,当把多个地址存放在一起用指针数组,数组类型为int*指针,数组里放变量的地址,例如:
int arr[10];存放整型的数组;
char arr[10];存放字符的数组
所以:存放指针的数组称为指针数组;首先是数组(把多个数组地址存放在一起),p先与[10]结合—>是个数组,数组里面是多个int型的地址所以用int*指针
三:什么是数组指针
重点它是个指针—>指向数组的指针,例如:
整型指针—>指向整型的指针
字符指针—>指向字符类型的指针
既然是指向数组的指针,那得有数组地址吧,还记得我一开头就强调的&arr吗?这就是一个数组地址,要将它存起来得用一个指针,先看图
因为&arr是整个数组的地址,所以要存放它得先是个指针—>(*p)【请回想一下我前面提到的】*的作用就是个指针标志,当p加是*就表示p为指针了;又因为arr数组有10个元素,每个元素是int,所以也就写成int(*p)[10]中文意思就是:它是个指针—>指向数组的指针
随堂提问一下:如果数组改为char arr[10];那&arr要用什么样的类型存起来呢?我相信你肯定一下就写出了正确答案。
那么肯定也有人想:int(*p)[10]中一定要加()?答案是:必须!肯定!如果不加()那么p就先与[10]结合了,不就变成指针数组了吗?这怎么行,记住!我们的目的是存放整个数组地址,那它得先是个指针。
有人可能会觉得比较绕,慢慢来多看几遍,要搞清楚指针数组和数组指针的概念,先与[]还是(*)相结合。
言已尽,希望这篇文章能帮助到大家理解指针,哪怕只有万分之一。若文中有什么不详细或错误的地方,还请各位老师指出,相互学习。