【发布时间】:2013-12-11 15:49:41
【问题描述】:
启发thisquiestion。
为什么——
void display(int p[][SIZE]) // allowed
和
void display(int p[][]) // not allowed
?
【问题讨论】:
-
因为数组不是指针,数组的数组也不是指针的指针。
标签: c arrays pointers multidimensional-array
启发thisquiestion。
为什么——
void display(int p[][SIZE]) // allowed
和
void display(int p[][]) // not allowed
?
【问题讨论】:
标签: c arrays pointers multidimensional-array
因为数组在传递给函数时衰减指向指针。如果不提供数组第二维的基数,编译器将不知道如何取消引用该指针。
这里有一个更长的解释:当你写这个时
p[index]
编译器执行一些指针运算来找到它需要引用的元素的地址:它将index乘以p元素的大小,并将其添加到p的基地址:
address = <base address of p> + index * <size of p's element>
当您尝试传递这样的数组p[][] 时,编译器只知道p 的基地址,但不知道其元素的大小。为了让编译器知道p元素的大小,你需要提供第二维的基数。
【讨论】:
因为二维数组是按行存储的,因此该函数需要列数,以便知道下一行何时开始。
【讨论】:
那是因为指针中的计算需要这样做。
当 p 指向大小为SIZE 的二维数组时,此操作p+=3 是这样计算的:
如果 p 的值是一个常数 等于 ADRESS p 接收这个值 ADRESS + 3*SIZE。
这是因为指针中的算术与实数中的算术不同。在不知道数组大小的情况下无法进行此计算。
【讨论】: