数组衰减为指针的例外情况?
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:首先,对于初始化,它专门说“字符串文字”。它根本没有提到“数组表达式”或“表达式”。所以字符串文字语法恰好用在两个地方:作为初始化的右侧,以及作为表达式。这并不意味着初始化的右侧是一个表达式。另外,这个问题专门询问了“数组名称”,并且字符串文字不是数组名称,并且您不能将数组名称(或除字符串文字之外的任何其他数组表达式)放在数组初始化的右侧。 以上是关于数组衰减为指针的例外情况?的主要内容,如果未能解决你的问题,请参考以下文章