【问题标题】:C - Array decays into pointers only when passed as arguments?C - 数组仅在作为参数传递时才会衰减为指针?
【发布时间】:2023-02-24 01:54:35
【问题描述】:

我读了很多关于 C 和数组衰减的主题,但我还不明白一个大问题。 “数组退化为指针”仅有的当它们被传递给另一个函数的广告参数或总是在声明时(these 情况除外)?所以这意味着,如果我对接受数组的函数执行相同的操作,但在 main 中,数组不会退化为指针?

【问题讨论】:

  • 选择一种语言,C 或 C++。
  • 任何时候你将数组用作指针,它都会衰减到一个指针(指向它的第一个元素)。这实际上包括索引数组的,因为对于任何数组(或指针)a和索引i,表达式a[i]确切地等于*(a + i)
  • if I do the same stuff of a function which accepts an array 我怀疑你可以在 C 中做到这一点而无需包装在 struct 中,但随后就变成了一个 moo 点。
  • C 中没有接受数组的函数。
  • 例如,在 C++ 中,在类似 char a[] = "abcdefg"; auto b = a; 的代码中,a 将“衰减”到第二个语句中的指针。

标签: c++ arrays c pointers


【解决方案1】:

在表达式中使用数组时,它会自动转换为指向其第一个元素的指针,但以下情况除外:

  • sizeof的操作数,
  • 它是一元&的操作数(“地址”,不是二进制“AND”),或者
  • 它是一个用于初始化数组的字符串文字(如char foo[] = "abc";)。

当函数声明包含参数声明为数组时,这不是表达式。解析声明的时候没有数组,所以没有转换数组的指针。然而,有一个调整的声明。当参数声明声明数组时,它会自动调整为声明指针。

表达式中转换数组的规则在C 2018 6.3.2.1 2。参数声明中调整数组的规则在6.7.6.3 7。

【讨论】:

  • 数组初始化中的字符串文字本身是否被视为数组?
  • @EugeneSh.:是的。
  • 值得添加引用 ID:C17dr § 6.3.2.1 3
  • 值得一提的是 _Alignof 运算符,以及即将推出的 typeof。
  • @tsanisl:_Alignof 不能应用于表达式;它的操作数必须是带括号的类型名称。它包含在 C 2011 的 6.3.2.1 2 中是一个错误。这在 C 2018 中得到了纠正。
猜你喜欢
  • 2011-11-14
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 2012-01-24
相关资源
最近更新 更多