C++中的数组是否与C相同?

use*_*621 10 c c++ arrays

C++编译器是否像在C中一样处理数组?

例如

在C中,

  • 使用下标运算符的数组访问始终被解释为指针.
  • 在函数参数中,数组声明被视为指向元素开始的指针.

jal*_*alf 14

是的,不是.大多数情况下,数组在两种语言中的工作方式相同(C99支持可变长度数组,而C++则不支持,并且可能还有一些其他微妙的差异).

但是,你所说的也不完全正确.编译器不会将数组访问视为指针,即使在C中也是如此.在某些情况下,数组访问可能更有效,因为编译器在数组情况下有更好的别名信息.在C和C++中,普通指针访问意味着编译器必须假定它可以为任何其他兼容类型添加别名.如果编译器只是将其视为指针取消引用,则此优化机会将丢失.

编辑
正如评论中所指出的,语言标准确实根据指针算术/解除引用来定义数组下标.当然,实际的编译器使用的附加信息的指针实际上是一个数组,所以他们不及时治疗究竟喜欢三分球,但可以考虑超出了标准规定的最优化.

  • 在语义上,带有下标*的数组访问是根据表达式定义的,在该表达式中,数组衰减为指向其第一个元素的指针(C++中的8.3.4/6).如果编译器可以跟踪某些指针来自哪里,为了推断出没有别名,那么.这是一个特别容易的例子,但我认为它被"解释为指针"仍然是正确的.当然它是*语言*,即使典型的实现特殊情况优化它. (5认同)

Naw*_*waz 7

与C99不完全相同.C99支持可变长度数组(VLA),但C++不支持.

void f(int n)
{
   int array[n]; //valid C99, but invalid C++
}
Run Code Online (Sandbox Code Playgroud)

这意味着,C++编译器不会像C(即C99)编译器那样处理数组.

但是,其他版本的C(即C89)不支持VLA.所以C89数组与C++数组几乎相同.