数组指针,就是指向数组的指针。
如果我们对一个数组取地址,得到的就是这个数组的地址,如果需要一个变量把这个地址存起来,这个变量的类型要怎么写呢?
比方说,我们有这样一个数组arr
int arr[10] = {0};
&arr;
直接写 &数组名 的时候,取出的是整个数组的地址,需要存在数组指针里面,而这里的数组指针类型应该这么写:
int arr[10] = {0};
int (*p)[10] = &arr;
这里的p由于和*括在一起,会先与星号结合,也就是说这是个指针。是个什么指针呢?向右边一看,有个[10],说明指向的是个数组,数组有10个元素,每个元素是什么类型呢?再向左边一看,有个int,说明数组元素是int类型。
知道了数组指针类型怎么写了,那数组指针有什么用呢?当我们对二维数组传参的时候,就会用到数组指针了,比如说,我们写一个函数来打印二维数组
int arr[3][5] = {{1,2,3,4,5}, {2,3,4,5,6}, {3,4,5,6,7}};
我们写一个print函数,并且把数组名传过去,由于无法在函数内部计算数组元素个数,所以把3行5列传过去。
int arr[3][5] = {{1,2,3,4,5}, {2,3,4,5,6}, {3,4,5,6,7}};
print(arr, 3, 5);
那么问题来了,数组名表示的是首元素的地址,那么这里的arr表示的是什么呢?
事实上,二维数组的“首元素”指的是第一行。什么意思呢?数组arr是一个3行5列的数组,如果把每一行看成一个元素,那么就相当于3个元素,而每个元素又是一个有着5个元素的一维数组。
所以数组arr的“首元素”其实就是第一行,也就是一个有着5个元素的一维数组!那么arr“首元素”的地址就是一个有着5个元素的一维数组的地址,所以我们传过去的数组名arr其实代表着一个数组指针,指向一个有着5个int元素的一维数组!那么有了前面的知识,就应该这么写形参:
void print(int (*p)[5], int r, int c)
{
}
那么我们怎么找到每一个元素并且打印出来呢?首先我们还是要遍历一遍这个二维数组:
void print(int (*p)[5], int r, int c)
{
int i = 0;
for (i=0; i
那么怎么找到每一个元素呢?p是一个数组指针,指向二维数组的第一行,那么加i就指向了第i行,也就是说,(p+i)这个指针就指向了第i行,那么我们对它解引用就能找到第i行
所以,*(p+i)就代表了第i行,前面说了,每一行是一个一维数组,那么第i行也是一维数组,拿到了第i行也就是拿到了第i行这个一维数组的数组名,而数组名代表了首元素的地址,也就是说,我们拿到了第i行第1个元素的地址,那么(*(p+i)+j)就是第i行第1个元素跳过了j个整形,也就指向了第i行第j个元素,那么对它进行解引用,也就是*(*(p+i)+j) 就是第i行第j列的元素,打印出来即可。
#include
void print(int (*p)[5], int r, int c)
{
int i = 0;
for (i=0; i
最后再说一句,如果去掉了数组指针的名字,得到的就是数组指针类型,比方说,前面的int (*p)[5]去掉p得到的int (*)[5]就是这个数组指针的类型。
感谢你的阅读,喜欢的话就点个赞吧,谢啦。