我知道在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.
为什么编译器会忽略第一个维度?
发布于 2014-10-14 03:00:27
void myFunction(int x[30])
等同于
void myFunction(int *x)
也就是说,当数组被用作函数的参数时,编译器将数组名称视为指向数组第一个元素的指针。在这种情况下,第一维的长度是没有用的。
这样,您必须显式地将数组的大小传递给函数。
发布于 2014-10-14 03:22:34
在函数参数声明的上下文中,T a[]
和T a[N]
都被解释为T *a
;也就是说,这三个函数都将a
声明为指向T
的指针。同时,除非是sizeof
的操作数或一元&
运算符,否则“T
的N元素数组”类型的表达式将被转换为“指向T
的指针”类型的表达式,其值将是数组的第一个元素的地址。
这并不是说这个维度被忽略了,而是它在这个上下文中没有意义。
发布于 2014-10-14 03:05:59
由于C函数不检查数组引用是否在边界内,并且它不为数组引用分配任何空间,因此维数在那里没有任何用处。它只计算从指针(数组的开始)的偏移量,并且它已经知道如何计算(基于int的大小)。
当您指定多个维度时,它只需要知道该维度,这样它就可以计算数组引用的正确偏移量。
https://stackoverflow.com/questions/26351931
复制