3.2 KiB
3.2 KiB
将二维数组传递给 C 语言中的函数
原文:https://overiq.com/c-programming-101/passing-2-d-array-to-a-function-in-c/
最后更新于 2020 年 7 月 27 日
就像一维数组一样,当二维数组传递给函数时,函数所做的更改会影响原始数组。但是在我们研究这个之前,我想明确几点。
我们在第章中了解到,当二维数组传递给函数时,可以选择指定最左边维度的大小。因此,如果我们有一个 2 行 3 维的数组,那么它可以通过以下两种方式传递给函数:
int two_d[2][3] = {
{99,44,11},
{4,66,9}
};
第一种方式:
void function(int a[][3])
{
// statements;
}
第二种方式:
void function(int a[2][3])
{
// statements;
}
回想一下,二维数组是按行主顺序存储的,即第一行 0 被存储,然后紧挨着它的第一行 1 被存储,以此类推。因此,在 C 语言中,二维数组实际上是一维数组,其中每个元素本身都是一维数组。因为数组的名称指向数组的第 0 个元素。在二维数组的情况下,第 0 个元素是数组。因此,从这个讨论中,我们可以得出two_d是指向 3 个整数的数组的指针。
因此,我们也可以声明一个函数,其中形式参数是指向数组的指针类型。
第三种方式:
void function(int (*a)[3])
{
// statements;
}
本质上,在讨论的所有三种情况下,变量a的类型是指向 3 个整数的数组的指针,它们的区别仅在于它们的表示方式。
好了,让我们回到最初的讨论——为什么函数所做的更改会影响原始数组?以下程序回答了这个问题。
#include<stdio.h>
void change_twod(int (*a)[3]);
int main()
{
int i,j, two_d[2][3] = {
{99,44,11},
{4,66,9}
};
printf("Original array: \n\n");
for(i = 0; i < 2; i++)
{
for(j = 0; j < 3; j++)
{
printf("%3d ", two_d[i][j]);
}
printf("\n");
}
change_twod(two_d);
printf("\n\nModified array : \n\n");
for(i = 0; i < 2; i++)
{
for(j = 0; j < 3; j++)
{
printf("%3d ", two_d[i][j]);
}
printf("\n");
}
// signal to operating system everything works fine
return 0;
}
void change_twod(int (*arr)[3])
{
int i, j;
printf("\n\nIncrementing every element by 5\n");
// increment original elements by 6
for(i = 0; i < 2; i++)
{
for(j = 0; j < 3; j++)
{
arr[i][j] = arr[i][j] + 5;
}
}
}
预期输出:
Original array:
99 44 11
4 66 9
Incrementing every element by 5
Modified array :
104 49 16
9 71 14
工作原理:
如本节前面所讨论的,two_d和arr是指向一个3整数数组的指针类型。在第 25 行中,change_twod()用two_d的实际参数调用,然后分配给arr。现在two_d和arr都指向同一个二维数组,因此,函数内部所做的更改将在函数main()中可见。