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

nj-*_*ath 56 c arrays pointers

我在许多帖子中都看到"在大多数情况下,数组名称会衰减为指针".
我可以知道在什么情况下/数组名称表达式不会衰减成指向其第一个元素的指针吗?

小智 51

当然.

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

  1. 当它是&(address-of)运算符的参数时.

  2. 当它是sizeof运营商的论点时.

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

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

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

  • @ H2CO3:首先,对于初始化,它专门说"string literal".它根本没有说"数组表达式"或"表达式".因此字符串文字语法恰好在两个地方使用:作为初始化的右侧,也作为表达式.这并不意味着初始化的右侧是表达式.此外,问题特别询问"数组名称",字符串文字不是数组名称,并且您不能在数组初始化的右侧放置数组名称(或除字符串文字之外的任何其他数组表达式). (5认同)
  • @TheJoker不,那将是`const char*str_ptr ="literal";`.在我的例子中,`str`被声明为一个数组,因此它**是一个数组. (3认同)
  • 对不起,你能更清楚地解释第三种情况吗?我的意思是不是第三种情况下的 *str* 用于引用字符串的内存位置?因此又是一个指针? (2认同)