Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么是C';编译器是否将s数组的第一个维度作为函数参数忽略?_C_Arrays_Compiler Construction - Fatal编程技术网

为什么是C';编译器是否将s数组的第一个维度作为函数参数忽略?

为什么是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. 为什么编译器会忽略第一个维度?根据语言,它不是

我知道如果我们用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.

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

根据语言,它不是被忽略/无用的。编译器可能会忽略它

如果在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中的编译器忽略了大小