2012-08-25 65 views
0

假设我有一个函数int function(int N, int c[N]){...},它将整数和数组作为参数。假设现在我有一个大小为'N倍2'的双数组**c,并且假设我想将函数function应用于双箭头c[i][0],i中的一列,从N到1变化。我该如何使用这个功能。它看起来像function(N,*c[0])如何将1D和2D数组参数传递给函数c

有没有人可以帮忙?

+0

当你写“双数组”我认为你的意思是“二维数组”。双数组是完全不同的东西。 –

+0

对不起,我认为这是正确的。我的意思是二维数组 – user1611830

+0

你应该明确地读到C中的指针和数组。一个二维数组和一个指向指针的指针(你的** c')完全不同的野兽并且不兼容。 –

回答

1

用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); 

可用于动态分配的二维数组。

+0

哇,真的有趣,谢谢! – user1611830

2

在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 
{ 

} 
+0

谢谢有趣! – user1611830

+0

你是对的,你不必在第一维中提及'N',但它可以被视为是显示代码意图的良好实践。对于固定大小,还有符号'int x [static 10]',它要求通过指针传递的数组至少有10个元素。 –

+0

好的,事实上我做的没有工作。如果我以下面的例子为例,假设我调用函数'function':void function(int rows,int x [] [5]),假设我稍后在我的代码中调用这个函数,在函数中(rows,x ),其中x是您提到的2D arry,它不起作用.... – user1611830