为什么char*p ="..."正确但int*p = {1,2}错了?

abn*_*ang 3 c++ arrays

const char *cval = "nothing";  // This is right.
int *ival = {1, 2, 3, 4};  // This is wrong.
Run Code Online (Sandbox Code Playgroud)

为什么第一个是对的,但第二个是错的?

AnT*_*AnT 6

之所以如此,是因为语言规范是这样说的(对每种语言都是独立的).

在C和C++中,字符串文字是无名对象,左值.由于它是一个对象,您可以使用指针指向它.同时{1, 2, 3, 4}它只是一个不代表对象的语法结构.它只是形成聚合初始化器语法的正式字符序列.

同时,在C语言中(自C99起),有一个名为复合文字的特征,它允许人们形成聚合类型的无名对象.例如,以下初始化有效

int *ival = (int []) {1, 2, 3, 4};
Run Code Online (Sandbox Code Playgroud)

这基本上是第一个声明的"int数组"对应物.所以,从C的角度来看,你的第二个声明是"错误的",因为你使用了不正确的语法.


Ton*_*roy 5

char *cval = "nothing";  // This is right.
Run Code Online (Sandbox Code Playgroud)

字符串文字有特殊处理 - 编译器知道将文本"nothing\0"放在某个(不可变)内存中的某个地方,使用类型char[],然后数组衰减到char*可以复制到的内容cval(对于C++ 03及更早版本,你应该使用的C++ 11 const char*).这与...形成鲜明对比

int *ival = {1, 2, 3, 4};  // This is wrong.
Run Code Online (Sandbox Code Playgroud)

...编译器不希望将{1,2,3,4}存储在只读内存中 - 它只需要:

  • 用于分配给数组-的值复制到连续的阵列位置的局部声明的对象(但如果ivalint*没有分配的值存储将投入)

  • 对于构造函数接受initializer_lists的类,创建一个并调用该构造函数.