为什么C&#39的数组第一维被编译器忽略为函数参数?

时间:2014-10-14 02:55:28

标签: c arrays compiler-construction

如果我们写的话,我知道在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.

为什么编译器会忽略第一个维度?

4 个答案:

答案 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一样接近机器而付出的代价。