二维数组传参的本质是使用数组指针将数组的地址传递给函数。在C语言中,二维数组在内存中是以连续的存储空间存放的,因此可以通过指针将数组的地址传递给函数,从而实现对二维数组的传参操作。
换个角度看二维数组,二维数组可以看作是每个元素都是一维数组的数组,那么二维数组的首元素就是第一行,是一个一维数组。所以,根据数组名是数组首元素地址这个规则,二维数组的数组名实际上就是二维数组的第一行的地址,是一维数组的地址。
下面来看一个简单的例子:
//二维数组传参的本质
#include<stdio.h>
void test(int(*p)[5], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf("%d ", *(*(p + i) + j));//先对行号解引用,再对列号解引用
}
printf("\n");
}
}
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;
}
在这个例子中,test函数接收一个包含五个元素的数组指针,以及数组的行和列数作为参数。在main函数中,将二维数组arr的地址传递给test函数。
因为二维数组在内存中是连续存放的,所以可以使用数组指针的方式将二维数组的地址传递给函数,从而在函数中对二维数组进行操作。这样就避免了直接复制整个数组数据,提高了程序的效率。
更多C语言相关练习请访问:test_c: C语言练习,包括常见语法练习以及小项目练习。 (gitee.com)