我知道只有一种情况,即数组传递到函数时它们会衰减为指针。是否有人可以详细说明所有数组衰减为指针的情况。
我知道只有一种情况,即数组传递到函数时它们会衰减为指针。是否有人可以详细说明所有数组衰减为指针的情况。
C 2011 6.3.2.1第3条:
除非它是sizeof操作符的操作数,或者一元运算符&的操作数,或者是用于初始化数组的字符串字面值,否则类型为“type数组”的表达式将被转换为具有类型“指向该数组对象初始元素的type指针”,并且不是左值。
换句话说,数组通常会衰减为指针。标准列出了它们不会衰减的情况。
有人可能认为,当您使用下标(如a[3]
)时,数组会像数组一样工作。然而,在这里发生的实际上是:
a
被转换为指针。a[3]
被计算为*((a)+(3))
。也就是说,a
被转换为指针,3被加到指针上,并应用*****运算符。)注意:C 2011文本包括“_Alignof”操作符。这在C 2018版标准中得到了纠正,并且我已经从上面的引文中省略了它。_Alignof
的操作数始终是一个类型;您实际上不能将其应用于对象。因此,C 2011标准将其包括在6.3.2.1第3条中是错误的。