假设我有一个函数int function(int N, int c[N]){...}
,它将整数和数组作为参数。假设现在我有一个大小为'N倍2'的双数组**c
,并且假设我想将函数function
应用于双箭头c[i][0]
,i
中的一列,从N到1变化。我该如何使用这个功能。它看起来像function(N,*c[0])
?如何将1D和2D数组参数传递给函数c
有没有人可以帮忙?
假设我有一个函数int function(int N, int c[N]){...}
,它将整数和数组作为参数。假设现在我有一个大小为'N倍2'的双数组**c
,并且假设我想将函数function
应用于双箭头c[i][0]
,i
中的一列,从N到1变化。我该如何使用这个功能。它看起来像function(N,*c[0])
?如何将1D和2D数组参数传递给函数c
有没有人可以帮忙?
用C数组时传递给函数总是衰减到指针到它的第一个元素。这在某些情况下很好知道。
举个例子,你可以写
int list[10];
func (int *x) {
int i;
for (i = 0; i < 10; i++) {
printf("%d", x[i]);
}
}
X [i]实际上只是语法糖。在C中,使用括号表示法访问数组的元素时,它将转换为*(x + i),其中x是数组的名称。
这是因为指针算术。如果x是10个整数数组的名称,则表达式中x的值是该数组的第一个整数的地址。我会一直指向x之后的第i个元素(C考虑到存储在数组中的元素类型的大小,并相应地增加指针)。
因此,当传递2d数组时,数组衰减为指向其第一个元素的指针 - 这是一个数组。
采取二维数组的函数签名可以被写为
func(int x[][columns] {
...
}
// but could also be written as
func(int (*x)[columns]) {
...
}
这表明x是指向整数数组。
有时您需要编写一个函数来接受一个2维数组,其宽度在运行时间之前是未知的。在这种情况下,您可以将指针传递给[0] [0]元素并传递这两个维度,然后使用指针算术获取正确的元素。例如,
print_2d_array (int *x, height, width) {
int i, j;
for (i = 0; i < height; i++) {
for (j = 0; j < width; j++) {
printf("%d", x[i * width + j]);
}
}
}
int list[10][10];
print_2d_array (&list[0][0], 10, 10);
可用于动态分配的二维数组。
哇,真的有趣,谢谢! – user1611830
在c语言中,对于单维数组,您不需要在将数组传递给该函数时在函数参数中提及数组的大小。
如果它是一个单维阵列
...
int a[10];
func(10, a);
...
void func(int size, int x[]) //no need to mention like int x[10]
{
//here x is not an array. Its equivalent to int *
printf("%d", sizeof(x)); // this will print 4 or 8 not 40
}
如果是2D阵列
...
int a[10][5];
func (10, a);
...
void (int rows, int x[][5]) //here int x[][] is invalid
{
}
谢谢有趣! – user1611830
你是对的,你不必在第一维中提及'N',但它可以被视为是显示代码意图的良好实践。对于固定大小,还有符号'int x [static 10]',它要求通过指针传递的数组至少有10个元素。 –
好的,事实上我做的没有工作。如果我以下面的例子为例,假设我调用函数'function':void function(int rows,int x [] [5]),假设我稍后在我的代码中调用这个函数,在函数中(rows,x ),其中x是您提到的2D arry,它不起作用.... – user1611830
当你写“双数组”我认为你的意思是“二维数组”。双数组是完全不同的东西。 –
对不起,我认为这是正确的。我的意思是二维数组 – user1611830
你应该明确地读到C中的指针和数组。一个二维数组和一个指向指针的指针(你的** c')完全不同的野兽并且不兼容。 –