为什么2维数组传递给函数需要它的大小?

时间:2013-12-11 15:49:42

标签: c arrays pointers multidimensional-array

灵感this静止。

为什么 -

void display(int p[][SIZE]) // allowed

void display(int p[][]) // not allowed

3 个答案:

答案 0 :(得分:6)

因为数组在传递给函数时会衰减指针。如果你没有提供数组第二维的基数,编译器就不会知道如何取消引用这个指针。

这是一个更长的解释:当你写这个

p[index]

编译器执行一些指针算法来查找它需要引用的元素的地址:它将index乘以p元素的大小,并将其添加到基址p

address = <base address of p> + index * <size of p's element>

当您尝试传递这样的数组p[][]时,编译器只知道p的基址,而不知道其元素的大小。这是为了让编译器知道你需要提供第二维基数的p元素的大小。

答案 1 :(得分:2)

因为2D数组是按行存储的,因此函数需要列数,以便它知道下一行的开始时间。

答案 2 :(得分:1)

那是因为指针中的计算需要这样做。 当p指向大小为SIZE的2维数组时,此操作p+=3将以这种方式计算:

如果p的值是常数,则等于ADRESS p接收此值ADRESS + 3 * SIZE。

这是因为指针中的arithmitic与实数中的arithmitic不同。如果不知道数组的大小,就无法进行此计算。