如何在C语言中把二维数组传递给函数
在这篇博客文章中,我将解释如何在C语言中把二维数组传递给函数。我还将向你展示根据你用来遍历数组的地址类型,有三种不同的方式来声明函数参数。
什么是二维数组?
二维数组是一个数组的数组。它可以被视为一个表格或一个矩阵,有行和列。例如,下面的声明创建了一个整数类型的二维数组,有2行3列:
int a[2][3] = {5,7,3,8,2,6};
要访问二维数组的元素,我们需要使用两个索引:一个表示行,一个表示列。例如,a[0][1]
表示第一行第二列的元素,它是7。
如何遍历二维数组?
我们可以使用三种类型的地址来遍历二维数组:
- 整个数组的地址:这是第一行第一个元素的地址。我们可以通过使用数组的名字或者使用
&a[0][0]
来得到它。例如,a
和&a[0][0]
都指向内存中的同一个位置。 - 一行的地址:这是某一行第一个元素的地址。我们可以通过使用数组名加上一个索引或者使用
&a[i][0]
来得到它,其中i
是行号。例如,a[0]
和&a[0][0]
都指向第一行,而a[1]
和&a[1][0]
都指向第二行。 - 一个元素的地址:这是某一行某一列特定元素的地址。我们可以通过使用数组名加上两个索引或者使用
&a[i][j]
来得到它,其中i
是行号,j
是列号。例如,&a[0][1]
指向元素7。
如何把二维数组传递给函数?
当我们把一个数组传递给函数时,我们实际上传递的是它的地址。因此,根据我们用来遍历数组的地址类型,我们需要相应地声明函数参数。
传递整个数组的地址
如果我们想把整个数组的地址传递给函数,我们需要把函数参数声明为指向二维数组的指针。语法如下:
void fun1(int (*p)[2][3], int hang, int lie);
这里,p
是一个指向整数类型二维数组的指针,该数组有2行3列。每个维度的大小必须在声明中指定。其他参数用来表示数组中的行数(hang)和列数(lie)。
要调用这个函数,我们需要使用&a
或者&a[0][0]
来传递整个数组的地址。例如:
fun1(&a, 2, 3);
在函数内部,我们可以使用(*p)[i][j]
来访问数组中的元素,其中i
和j
是循环变量。例如:
void fun1(int (*p)[2][3], int hang, int lie)
{
int i, j;
for (i = 0; i < hang; i++)
for (j = 0; j < lie; j++)
printf("%d ", (*p)[i][j]);
}
传递一行的地址
如果我们想把一行的地址传递给函数,我们需要把函数参数声明为指向数组的指针。语法如下:
void fun2(int (*p)[3], int hang, int lie);
这里,p
是一个指向整数类型数组的指针,该数组有3个元素。第二维度的大小必须在声明中指定。其他参数用来表示数组中的行数(hang)和列数(lie)。
要调用这个函数,我们需要使用a
或者&a[i][0]
来传递一行的地址,其中i
是行号。例如:
fun2(a, 2, 3); // 等价于 fun2(&a[0][0], 2, 3);
在函数内部,我们可以使用p[i][j]
来访问数组中的元素,其中i
和j
是循环变量。例如:
void fun2(int (*p)[3], int hang, int lie)
{
int i, j;
for (i = 0; i < hang; i++)
for (j = 0; j < lie; j++)
printf("%d ", p[i][j]);
}
传递一个元素的地址
如果我们想把一个元素的地址传递给函数,我们需要把函数参数声明为指向整数的指针。语法如下:
void fun3(int *p, int hang, int lie);
这里,p
是一个指向整数的指针。其他参数用来表示数组中的行数(hang)和列数(lie)。
要调用这个函数,我们需要使用&a[i][j]
或者a[i]+j
来传递一个元素的地址,其中i
和j
是行号和列号。例如:
fun3(&a[0][0], 2, 3); // 等价于 fun3(a[0], 2, 3);
在函数内部,我们可以使用p[i*lie+j]
来访问数组中的元素,其中i
和j
是循环变量。例如:
void fun3(int *p, int hang, int lie)
{
int i;
for (i = 0; i < hang*lie; i++)
printf("%d ", p[i]);
}
关于数组参数的注意事项
当我们使用数组作为函数参数时,编译器会把它解释为一个指针。因此,下面的声明是等价的:
void fun1(int p[2][5], int hang, int lie); // [2]被编译器解释为*
void fun1(int p[][5], int hang, int lie); // 和上面一样
void fun1(int (*p)[5], int hang, int lie); // [ ]等价于*
这三种声明都意味着p
是一个指向整数类型数组的指针,该数组有5个元素。第二维度的大小必须在声明中指定。
结论
在这篇博客文章中,我解释了如何在C语言中把二维数组传递给函数。我还向你展示了根据你用来遍历数组的地址类型,有三种不同的方式来声明函数参数。我希望你觉得这篇文章有用并且有趣。如果你有任何问题或反馈,请随时在下面留言。谢谢你的阅读!