每日壁纸分享(出处: 极简壁纸_海量电脑桌面壁纸美图_4K超高清_最潮壁纸网站)
前言
在上一篇博客中,我给大家分享了一维数组传参的本质,为了知识的连贯性,我便忙里偷闲地写下了这篇二维数组传参本质,希望大家看完之后能有所收获,谢谢。
目录
如果我们需要了解二维数组传参的本质,那么就得先学习数组指针。
数组指针
数组指针,顾名思义,它是一个指针的变量的一种并且它所指向的空间是数组,接下来我将简单地讲述数组指针的格式、数据类型,以方便后文的推进。
数组指针的格式:
如上图,我创建了一个整型数组arr,数组元素为5,那么若想将该数组的地址存放至数组指针中,就应当写成: int (* name ) [ 5 ], 它的数据类型是 int (* ) [ 5 ]。
理解:上述代码中,数组指针的类型是:int (*) [5] ———> parr先和*结合,说明p是⼀个指针变量,然后指针指向的是⼀个⼤⼩为10的整型数组。(这⾥要注意:[]的优先级要⾼于*号的,所以必须加上()来保证p先和*结合。)
数组指针数据类型解析:
二维数组传参的本质
以下标访问访问二位数组:
在之前我们学过二维数组传参,如下:
void test(int arr[3][5], int r, int c)
{
int i = 0;
for (i = 0; i < r; i++)
{
int j = 0;
for (j = 0; j < c; j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
return;
}
int main()
{
int arr[3][5] = { {1,2,3,4,5} ,{2,3,4,5,6}, {3,4,5,6,7} };
test(arr, 3, 5);//打印二维数组的每个元素
return 0;
}
我们这里将实参和形参都写成了二维数组的形式,那么还有其他方式吗?回答肯定的,接下来我们引入本章的重点:二维数组传参的本质
二维数组传参的本质:
以上述代码为例。
二维数组其实可以看做是存放一维数组的数组,他的每个元素都是一维数组。根据二维数组名表示首元素的地址,在这里就可以理解为如果我们传参只传递二维数组的数组名,那么得到的就是它第一个元素的地址,而又因为二维数组的每一个元素都是一维数组,故我们得到的是一个数组指针变量。
而这个数组指针变量就是第一个数组的地址,如下:
所以我们得出 arr == int (*arr)[5] (因为数组是int类型,每个一维数组都是5个元素)
我们在二维数组传参时也是传的数组名,那么在形参部分也可以使用指针变量进行接收,对代码改造如下:
- 因为arr是二维数组中首个一维数组的数组指针变量, 那么*arr == *(数组名) ==> 一维数组首元素地址
- 所以*(arr+i)就可以遍历二维数组中的所有一维数组的首元素地址
- 在*(arr+i)的基础上,因为我们已经得到一维数组首元素的地址了,那么* (*(arr+i)+j)就可以遍历该一维数组的每个元素
传参原理解析:
因为在二维数组传参时,传递的是首元素的地址。而二维数组是以一维数组为元素的数组,所以二维数组传参实际上传的是二维数组内首个一维数组的数组指针变量。所以在形参的部分我们可以使用数组指针对其进行接收。
利用数组指针遍历二维数组原理解析:
在二维数组中,每个元素都是连续存放的,如下图:
在我们函数传参,传过去的是首个一维数组的数组指针,如上图 &arr[0] == int(*arr)[5] ,在我们得到该数组指针后,创建了两个循环,外层循环用来遍历二维数组的下标,内层循环用来遍历一维数组的下标。
因为传过来的是 arr == &arr[0],那么*arr == arr[0] == 一维数组名 == 一维数组首元素地址,故
*(arr+i)即可遍历所有一维数组的首元素名。
既然已经有了首元素名,则有 (*(parr+i)+ j)== 一维数组中元素的地址,只需 *(*(arr+i)+ j)即可遍历一维数组中的所有元素,这就是二维数组利用指针遍历数组的原理。
本次分享到此结束 ,谢谢大家观看!