在C语言中传递二维数组给函数的完整指南

如何在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]来访问数组中的元素,其中ij是循环变量。例如:

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]来访问数组中的元素,其中ij是循环变量。例如:

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来传递一个元素的地址,其中ij是行号和列号。例如:

fun3(&a[0][0], 2, 3); // 等价于 fun3(a[0], 2, 3);

在函数内部,我们可以使用p[i*lie+j]来访问数组中的元素,其中ij是循环变量。例如:

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语言中把二维数组传递给函数。我还向你展示了根据你用来遍历数组的地址类型,有三种不同的方式来声明函数参数。我希望你觉得这篇文章有用并且有趣。如果你有任何问题或反馈,请随时在下面留言。谢谢你的阅读!

  • 10
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南侠客(上海)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值