如果我们写的话,我知道在C中:
void myFunction(int x[30]) // 30 is ignored by the compiler
void myFunction(int x[][30]) // 30 is not ignored here but if I put say '40' in the first dimension
// it would be ignored.
为什么编译器会忽略第一个维度?
答案 0 :(得分:3)
void myFunction(int x[30])
相当于
void myFunction(int *x)
即,当数组用作函数的参数时,编译器将数组名称视为指向数组的第一个元素的指针。在这种情况下,第一维的长度是没有用的 这样,您必须将数组的大小显式传递给函数。
答案 1 :(得分:3)
在函数参数声明的上下文中,T a[]
和T a[N]
都被解释为T *a
;也就是说,所有三个都将a
声明为指针到T
。这与以下事实一致:除非它是sizeof
或一元&
运算符的操作数,否则“{元素数组T
”类型的表达式将被转换为“指向T
的指针”的表达式,其值将是数组第一个元素的地址。
这并不是忽略维度,而是在这种情况下它没有意义。
答案 2 :(得分:1)
由于C函数不检查数组引用是否在边界内,并且由于它没有为它分配任何空间,因此该维度没有用处。它只计算指针的偏移量(数组的开头),它已经知道如何做(基于int的大小)。
当您指定多个维度时,它只需要知道该维度,以便它可以计算数组引用的正确偏移量。
答案 3 :(得分:0)
根据语言不被忽视/无用。编译器可能会忽略它。
如果在myFunction中,你写:
... x[29] ...
你得到一个有效的程序。
如果你写
... x[30] ...
您的程序有未定义的行为。编译器可能会也可能不会对此进行检查。
编译器无法始终检查所有内容这一事实是因为语言与C一样接近机器而付出的代价。