如果假设我有两个数组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
}
答案 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!