我有一个函数,它有时会与常规的,有时是动态的数组一起被调用。(gcc)用于无警告编译的多点阵列或双指针
如果我定义功能
function_name(int[10][10] a)
和发送INT **作为参数,我得到一个警告。相反,如果我声明
function_name(int** a)
和发送INT [] []作为参数(铸造后)我无法访问数组元素内的功能。
什么是相应的方法?
我有一个函数,它有时会与常规的,有时是动态的数组一起被调用。(gcc)用于无警告编译的多点阵列或双指针
如果我定义功能
function_name(int[10][10] a)
和发送INT **作为参数,我得到一个警告。相反,如果我声明
function_name(int** a)
和发送INT [] []作为参数(铸造后)我无法访问数组元素内的功能。
什么是相应的方法?
当一个阵列被传递给函数,它“衰变”的指针到它的第一元件。所以,下式给出:
T a[10];
f(a);
在呼叫f(a)
,a
实际上是&a[0]
,即,指针,和类型是T *
(的&a[0]
类型)。
当你有数组的数组中,相同的规则应用于:
T a[10][5];
f(a);
a
衰减到指针再次,等于&a[0]
。 a[0]
是“T
”的“阵列[5]”类型。所以,&a[0]
的类型是“指针数组[5]的T
”,即,如果你要声明指针p
设置等于&a[0]
,你会做:
T (*p)[5]; /* parentheses because [] binds tighter than * */
p = &a[0];
鉴于上述情况,并假设您的阵列在所调用的代码宣布,应声明你的函数为:
function_name(int (*a)[10]);
如需更多信息,请参阅this。
function_name(int[10][10] a)
—中存在语法错误,您需要在“变量”名称后指定数组大小:function_name(int a[10][10])
。实际上,由于上面提到的“衰减”,以上相当于function_name(int (*a)[10])
。
编辑:啊,我想我现在明白了。由于上述原因(指针的“衰减”只发生一次),您不能声明既采用“二维”数组又采用指针指针的函数。指向指针的指针可能不指向连续的数据,并且可能在每个“行”中具有不同数量的元素。一个数组数组不能有这些属性。他们根本不同。
int **
和int [][]
是不一样的。 前者是pointer to pointer to int
,而第二个是int
的二维数组。
int[][]
decays to int (*)[]
when you pass it as argument to function.
void func(int arr[][10]) { //decays to `int (*arr)[10]`
printf("%d correct", arr[1][9]); //10th element of 2nd row
//printf("%d correct", (*(arr + 1))[9]); //same as above
}
int main() {
int (*arr)[10]; //pointer to array of ints
arr = malloc(sizeof(int (*)[]) * 2); //2 rows & malloc will do implicit cast.
arr[1][9] = 19;
func(arr);
return 0;
}