【问题标题】:What are the cases in which arrays decay to pointers?数组衰减为指针的情况有哪些?
【发布时间】:2012-11-14 04:17:45
【问题描述】:

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

【问题讨论】:

  • 必须在某处被欺骗。
  • @RichardJ.RossIII 我不认为这是重复的,这里的 OP 要求提供所有案例的列表,我在那里没有看到。
  • 这不是我知道的任何问题的重复。除非您有充分的理由,否则请停止投票结束。这是一个合法且好的问题。
  • @R.. 你可以考虑重新投票。
  • 谢谢。在我评论的时候它还没有关闭。我已经投票决定现在重新开放。

标签: c pointers multidimensional-array


【解决方案1】:

C 2011 6.3.2.1 3:

除非它是 sizeof 运算符的操作数,...或一元 & 运算符,或者是用于初始化数组的字符串字面量,否则表达式具有类型 “array of type”被转换为类型为“pointer to”的表达式 type”,指向数组对象的初始元素,不是左值。

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

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

  • a 被转换为指针。
  • 下标运算符作用于指针和下标以产生一个指定对象的左值。 (具体来说,a[3] 被计算为*((a)+(3))。也就是说,a 被转换为指针,指针加上 3,并应用了 ***** 运算符。)

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

【讨论】:

  • 我最喜欢的关于基本数组与指针差异的总结来自我以前的大学编译器讲师;她对此也颇感兴趣:“指针是一个保存地址的变量;一个数组很简单,一个地址。”很难比这更简单。
  • @WhozCraig 绝对正确,但是 -- what 的地址?
猜你喜欢
  • 2013-07-19
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 2017-05-05
  • 2020-10-02
  • 2021-12-01
相关资源
最近更新 更多