【问题标题】:Exceptions to array decaying into a pointer?数组衰减为指针的例外情况?
【发布时间】:2013-07-19 03:29:56
【问题描述】:

我在许多帖子中看到“在大多数情况下,数组名称会衰减为指针”。
我能否知道在哪些情况/表达式中数组名称不会衰减为指向其第一个元素的指针?

【问题讨论】:

  • 需要更多上下文:您是否使用特定语言工作?你有例子吗?
  • 考虑 C 语言。我正在寻找一个数组名称不会衰减为指针的示例。
  • @TheJoker 我给了here an answer,我在其中展示了这些案例
  • 关于 H2Co3 的第二点,即使用 sizeof,我正在阅读 Head First C,它首先说明了在 msg 作为参数传入的函数中使用 sizeof(msg) 的指针衰减。他们有一个小盒子解释说,当数组变量作为参数(释义)传递给函数时,它会衰减为指针,所以你得到 4 或 8(字节),而不是数组大小。我很困惑,因为在字符串库的下一章中,他们介绍了 strlen() 并以与使用 sizeof() 相同的方式使用它。我来这里是为了把我的头伸直,现在你把它扭曲了一点。 :P
  • This answer 包含所有例外示例。

标签: c arrays pointers


【解决方案1】:

当然。

在C99中有三种基本情况,即:

  1. 当它是&(地址)运算符的参数时。

  2. 当它是sizeof 运算符的参数时。

  3. 当它是char [N + 1] 类型的字符串文字或wchar_t [N + 1] 类型的宽字符串文字(N 是字符串的长度)时,用于初始化数组,如char str[] = "foo";wchar_t wstr[] = L"foo";

此外,在 C11 中,新引入的 alignof 运算符也不会让它的数组参数衰减为指针。

在 C++ 中,还有其他规则,例如,当它通过引用传递时。

【讨论】:

  • 很抱歉,您能否更清楚地解释第三种情况?我的意思是第三种情况下的 str 不是用来引用字符串的内存位置吗?因此又是一个指针?
  • @TheJoker 不,应该是const char *str_ptr = "literal";。在我的示例中,str 被声明为一个数组,因此它一个数组。
  • @GrijeshChauhan 谢谢:)
  • 第三种情况不是个案。当它是char 的数组时,这只是数组初始化语法的一种情况。数组初始化语句的右侧甚至不带表达式,因此作为这个问题的答案没有意义。
  • @H2CO3:首先,对于初始化,它专门说“字符串文字”。它根本没有提到“数组表达式”或“表达式”。所以字符串文字语法恰好用在两个地方:作为初始化的右侧,以及作为表达式。这并不意味着初始化的右侧是一个表达式。另外,这个问题专门询问了“数组名称”,并且字符串文字不是数组名称,并且您不能将数组名称(或除字符串文字之外的任何其他数组表达式)放在数组初始化的右侧。
猜你喜欢
  • 2012-11-14
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 2020-10-02
  • 2021-12-01
相关资源
最近更新 更多