C++ 为什么char*p="&引用;对,但int*p={1,2}错了?

C++ 为什么char*p="&引用;对,但int*p={1,2}错了?,c++,arrays,C++,Arrays,为什么第一种是正确的,而第二种是错误的?之所以如此,是因为语言规范如此规定(对于每种语言都是独立的) 在C和C++中,字符串文字是一个无名对象,一个LValk。因为它是一个对象,所以可以用指针指向它。同时,{1,2,3,4}只是一个不表示对象的语法结构。它只是形成聚合初始值设定项语法的正式字符序列 同时,在C语言中(从C99开始),有一个称为复合文字的特性,它允许形成聚合类型的无名对象。例如,以下初始化是有效的 const char *cval = "nothing"; // This is

为什么第一种是正确的,而第二种是错误的?

之所以如此,是因为语言规范如此规定(对于每种语言都是独立的)

在C和C++中,字符串文字是一个无名对象,一个LValk。因为它是一个对象,所以可以用指针指向它。同时,

{1,2,3,4}
只是一个不表示对象的语法结构。它只是形成聚合初始值设定项语法的正式字符序列

同时,在C语言中(从C99开始),有一个称为复合文字的特性,它允许形成聚合类型的无名对象。例如,以下初始化是有效的

const char *cval = "nothing";  // This is right.
int *ival = {1, 2, 3, 4};  // This is wrong.
这基本上是第一个声明的“int数组”对应项。因此,从C的角度来看,您的第二个声明是“错误的”,因为您使用了不正确的语法

int *ival = (int []) {1, 2, 3, 4};
字符串文字有特殊的处理方法-编译器知道将文本“nothing\0”放在某个(不可变)内存中的某个地方,类型为
char[]
,然后数组衰减为
char*
,可以复制到
cval
(对于C++03和更早版本,在C++11中应该使用
const char*
)。这与

char *cval = "nothing";  // This is right.
…如果编译器不一定要在只读内存中存储{1,2,3,4},那么它只需要:

  • 对于数组赋值-将值复制到本地声明对象中的连续数组位置(但是当
    ival
    int*
    时,没有为要放入的值分配内存)

  • 对于构造函数接受初始值设定项列表的类,创建一个并调用该构造函数


有三个不同的语言标签,不可能知道如何回答这个问题。为什么这个标签是
c
c++
?仅根据编译方式对其进行标记。对于c++11,两者都是错误的,只能将字符串文本绑定到
const char*
int ival[]={1,2,3,4};//这是正确的
short版本:字符串文本存在,而其他文本不存在。括号内的初始值设定项列表不是文字值。对于int指针,编译器无法确定数组大小。请注意,字符串文字也是如此。如果只有一个
char常量*
,则在运行时需要
strlen
来查找大小。
int *ival = {1, 2, 3, 4};  // This is wrong.