【C语言】数组指针

数组指针,就是指向数组的指针。

如果我们对一个数组取地址,得到的就是这个数组的地址,如果需要一个变量把这个地址存起来,这个变量的类型要怎么写呢?

比方说,我们有这样一个数组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

【C语言】数组指针_第1张图片 

最后再说一句,如果去掉了数组指针的名字,得到的就是数组指针类型,比方说,前面的int (*p)[5]去掉p得到的int (*)[5]就是这个数组指针的类型。 

 感谢你的阅读,喜欢的话就点个赞吧,谢啦。

你可能感兴趣的:(c语言,开发语言,后端)