什么情况下数组会衰变为指针?

4

我知道只有一种情况,即数组传递到函数时它们会衰减为指针。是否有人可以详细说明所有数组衰减为指针的情况。


这一定是某个地方的重复内容。 - Richard J. Ross III
1
@RichardJ.RossIII 我不认为这是重复的,这里的OP要求列出所有情况,但我在那边没有看到。 - Daniel Fischer
1
这不是我所知道的任何问题的重复。除非你有充分的理由,否则请停止投票关闭。这是一个合法且良好的问题。 - R.. GitHub STOP HELPING ICE
@R.. 你可以考虑投一票以重新开放。 - Daniel Fischer
谢谢。在我发表评论时它还没有关闭。我现在已经投票要重新打开它了。 - R.. GitHub STOP HELPING ICE
1个回答

13

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条中是错误的。


我最喜欢的关于基本数组与指针差异的总结来自我的大学编译器讲师;她对此非常兴奋:“指针是一个保存地址的变量;而数组则很简单,就是一个地址。”很难再比这更简单明了了。 - WhozCraig
@WhozCraig 绝对正确,但是 - 什么 的地址? - Peter - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接