4

当数组传递给函数时,我只知道一种情况,它们会衰减为指针。任何人都可以详细说明数组衰减为指针的所有情况。

4

1 回答 1

13

C 2011 6.3.2.1 3:

除非它是sizeof运算符的操作数,...或一元&运算符,或者是用于初始化数组的字符串文字,否则类型为“类型数组的表达式将转换为类型为“类型指针”的 表达式” 指向数组对象的初始元素,不是左值。

换句话说,数组通常衰减为指针。该标准列出了没有的情况。

有人可能会认为,当您将数组与下标一起使用时,它们就像数组一样,例如a[3]. 然而,这里发生的实际上是:

  • a转换为指针。
  • 下标运算符作用于指针和下标以产生指定对象的左值。(特别是,a[3]被评估为*((a)+(3))。即a转换为指针,将 3 添加到指针,并应用 ***** 运算符。)

注意:C 2011 文本包括“ _Alignof运算符”。这在标准的 C 2018 版本中得到了纠正,我已经从上面的引用中删除了它。的操作数_Alignof始终是类型;您实际上无法将其应用于对象。因此,C 2011 标准将其包含在 6.3.2.1 3 中是一个错误。

于 2012-11-26T16:38:06.920 回答