为什么是C';编译器是否将s数组的第一个维度作为函数参数忽略?
我知道如果我们用C写:为什么是C';编译器是否将s数组的第一个维度作为函数参数忽略?,c,arrays,compiler-construction,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. 为什么编译器会忽略第一个维度?根据语言,它不是
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.
为什么编译器会忽略第一个维度?根据语言,它不是被忽略/无用的。编译器可能会忽略它 如果在myFunction中,您可以编写:
... x[29] ...
你得到了一个有效的程序
如果你写信
... x[30] ...
您的程序具有未定义的行为。编译器可能会也可能不会对此进行检查
编译器不能总是检查所有的东西,这是一个人为拥有一种像C一样接近机器的语言所付出的代价。根据语言的不同,它不是被忽略的/无用的。编译器可能会忽略它
void myFunction(int x[30])
如果在myFunction中,您可以编写:
... x[29] ...
你得到了一个有效的程序
如果你写信
... x[30] ...
您的程序具有未定义的行为。编译器可能会也可能不会对此进行检查
事实上,编译器不能总是检查所有东西,这是一个人为拥有一种像C一样接近机器的语言所付出的代价
void myFunction(int x[30])
相当于
void myFunction(int *x)
i、 当数组用作函数的参数时,编译器会将数组名视为指向数组第一个元素的指针。在这种情况下,第一个尺寸的长度没有用处。这样,您必须将数组的大小显式地传递给函数 相当于
void myFunction(int *x)
i、 当数组用作函数的参数时,编译器会将数组名视为指向数组第一个元素的指针。在这种情况下,第一个尺寸的长度没有用处。这样,您必须将数组的大小显式地传递给函数。因为C函数不检查数组引用是否在边界内,并且因为它不为数组引用分配任何空间,所以维度在那里没有用处。它只计算与指针(数组开头)的偏移量,并且已经知道如何计算(基于int的大小)
当您指定多个维度时,它只需要知道该维度,以便计算数组引用的正确偏移量。由于C函数不检查数组引用是否在边界内,并且没有为其分配任何空间,因此该维度在那里没有用。它只计算与指针(数组开头)的偏移量,并且已经知道如何计算(基于int的大小)
当指定多个维度时,它只需要知道该维度,以便计算数组引用的正确偏移量。在函数参数声明的上下文中,
ta[]
和ta[N]
都被解释为T*a
;也就是说,这三个函数都将a
声明为指向T
的指针。此外,除非它是sizeof
或一元&
运算符的操作数,否则“T的N元素数组”类型的表达式将转换为“指向T
的指针”类型的表达式,其值将是数组第一个元素的地址
不是维度被忽略了,而是它在这个上下文中没有意义。在函数参数声明的上下文中,
ta[]
和ta[N]
都被解释为T*a
;也就是说,这三个函数都将a
声明为指向T
的指针。此外,除非它是sizeof
或一元&
运算符的操作数,否则“T的N元素数组”类型的表达式将转换为“指向T
的指针”类型的表达式,其值将是数组第一个元素的地址
并不是维度被忽略了,而是它在这种情况下没有意义。C数组不执行任何边界检查,那么不忽略第一个维度意味着什么?编译器将如何处理它?@ruakh循环参数。如果类型匹配,则无法传递不同不兼容大小的数组。另外,当有大小信息时,您可以使用
sizeof
运算符获得数组长度。@juanchopanza:我不确定“循环参数”是什么意思。C数组从不执行任何边界检查,即使在同一函数中声明和使用。(你的其他例子都很好。)@ruakh抱歉,这不是循环论证。我的意思是,尽管没有边界检查,例如,如果传递的数组与长度不匹配,编译器可能会发出错误。相反,该语言允许您输入大小,然后将类型调整为指针。这太令人困惑了!C数组不执行任何边界检查,所以不忽略第一个维度意味着什么?编译器将如何处理它?@ruakh循环参数。如果类型匹配,则无法传递不同不兼容大小的数组。另外,当有大小信息时,您可以使用sizeof
运算符获得数组长度。@juanchopanza:我不确定“循环参数”是什么意思。C数组从不执行任何边界检查,即使在同一函数中声明和使用。(你的其他例子都很好。)@ruakh抱歉,这不是循环论证。我的意思是,尽管没有边界检查,例如,如果传递的数组与长度不匹配,编译器可能会发出错误。相反,该语言允许您输入大小,然后将类型调整为指针。这太令人困惑了!即使编译器不会检查传递给函数的参数,它也会将信息传递给读取函数签名的程序员——这个函数期望(至少)30个整数的数组作为第一个参数,而不仅仅是一个指向整数的指针。没错,但问题是为什么编译器“忽略”此值。但是此cas中的编译器忽略了大小