本文会介绍二维数组常见的三种传参方式,以整形数组为例。
1.int arr[行数][列数]
int arr[2][4] = { 1,2,3,4,0,1,2,3 };
例如将上面的二维数组传入下方的函数 函数形参可以如下设置
void Print(int arr[2][4], int m, int n)
{
int i = 0,j=0;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
实参传递方式如下
Print(arr, 2, 4);
2.int arr[][列数]
可以看到相较于第一种方式只是省略了行数,那可不可以省略列数呢,答案是不能
3.以数组指针的方式传参
第三种方式也是本文着重介绍的方式
首先 介绍数组指针的定义方式
类型名 (*变量名)[一行的元素个数]
例如 int (*p)[5] 表示p可以指向一个一行有五个元素的整形数组
注意:这里的"()"不能省略 否则上面的定义就成了一个指针数组了
对这里"()"的解释:首先清楚 我们要定义的是一个指针 而"[]"的优先级更高 因此我们要加"()"使得"*"优先与P结合
了解了数组指针的定义方法,我们可以设计函数的形参了
int arr[2][4] = { 1,2,3,4,0,1,2,3 };
int(*p)[4] = arr;
将上面定义的数组传入下方函数,形参可设计如下
void Print(int(*p)[4], int m, int n)
{
int i = 0,j=0;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
printf("%d ", (*(p + i))[j]);
}
printf("\n");
}
}
实参传递方式:Print(p, 2, 4);
注意:对printf("%d ", (*(p + i))[j])的理解,p指向了二维数组的第一行,p+i 指向了二维数组第i行。解引用后我们就拿到了p+i行,即*(p+i)是p+i行的首元素地址。有了首元素地址 ,我们则可以按照 "(首元素地址)[下标]"的格式访问数组元素。 如果你理解了,就能理解另一种写法 前面提到*(p+i)是第i行首元素的地址
那么 *(p+i)+j 不就是第i行j列元素的地址 再解引用我们便能拿到地址中的内容 这便是另一种写法 *(*(p+i)+j)
代码段里的东西很重要