为什么不能将作为输入参数传递给函数的2D数组在其函数声明中声明为int **?

时间:2017-11-11 17:01:48

标签: c arrays

如果假设我有两个数组arr一维数组和brr一个二维数组,我想将这些数组作为输入传递给函数

如果是1D:

void fun(int*);void fun(int[]); //both declarations are allowed

fun(arr);//call for 1D

void fun(int *ptr)
{
 //function def of 1D
}

但是在2D阵列的情况下:

void fun(int[][]); //allowed
void fun(int**);  //this is not allowed **WHY so?**

虽然调用和定义类似于之前的1D数组

fun(brr);//call

void fun(int **ptr2)
{
 //code
}

1 个答案:

答案 0 :(得分:1)

这是因为按照惯例,在很多情况下,指向数组的指针被认为是指向第一个类型元素的限定指针,尤其是在函数传递参数上。

您可以参考 ISO / IEC 9899:2011 § 6.7.6.3函数声明符(包括原型) - 语义

  

参数声明为''数组类型''应调整为   ''类型''的限定指针,类型限定符(如果有的话)   在数组类型派生的[和]内指定的那些。如果   关键字static也出现在数组类型的[和]中   派生,然后对每个函数的调用,值的   相应的实际参数应提供对第一个的访问权限   数组的元素,其元素至少与指定的元素一样多   大小表达。

但类型int[][]而不是int**的声明是不可互换的,因为虽然第一个引用了一个2D数组,但它会被编译器静默地更改为指向第一个元素的指针。 2D数组,第二个意味着指向int 指针的指针,它与2D数组不兼容。

有时人们会被动态定义的伪二维数据混淆,如下所示:

int **My_2D_array = malloc(sizeof(int *) * 2);  //We are allocating 2 pointers to int
My_2D_array[0] = malloc(sizeof(int)*2);  //We allocate the first dimension space
My_2D_array[1] = malloc(sizeof(int)*2);  //We allocate the second dimension space

在这种情况下,名称My_2D_array将被称为2个指向int的数组的第一个元素的地址,并且使用[]运算符将返回第一个指针。指针数组。再次将操作符[]应用到刚刚获得的指针上,并再次用作int的单维数组的第一个元素的地址,将重新调整int:

int my_int = My_2D_array[0][1];  //mimics a bidimensional array, but isn't!