数组衰减为指针的例外情况?

Posted

技术标签:

【中文标题】数组衰减为指针的例外情况?【英文标题】: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 包含所有例外示例。 【参考方案1】:

当然。

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

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

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

    当它是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:首先,对于初始化,它专门说“字符串文字”。它根本没有提到“数组表达式”或“表达式”。所以字符串文字语法恰好用在两个地方:作为初始化的右侧,以及作为表达式。这并不意味着初始化的右侧是一个表达式。另外,这个问题专门询问了“数组名称”,并且字符串文字不是数组名称,并且您不能将数组名称(或除字符串文字之外的任何其他数组表达式)放在数组初始化的右侧。

以上是关于数组衰减为指针的例外情况?的主要内容,如果未能解决你的问题,请参考以下文章

什么是数组到指针衰减?

数组表示法衰减为指针符号 - 仅用于函数参数?

用指向数组的指针替换衰减的数组导致分段错误

在分配给指向固定数组的指针期间没有指针衰减

c ++动态指针数组[重复]

阵列衰减和修改