char*字符串文字如何有效?

sor*_*kie 0 c c++ pointers initialization

所以从我的理解指针变量指向一个地址.那么,以下代码如何在C++中有效?

char* b= "abcd"; //valid
int *c= 1; //invalid
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 7

第一行

 char* b= "abcd";
Run Code Online (Sandbox Code Playgroud)

在C中有效,因为"字符串文字"虽然用作初始化程序,但归结为文字中第一个元素的地址,即指针(to char).

相关的,C11章节§6.4.5,字符串文字,

[...]多字节字符序列然后用于初始化静态存储持续时间和长度的数组,足以包含序列.对于字符串文字,数组元素具有类型char,并使用多字节字符序列的各个字节进行初始化.[...]

然后,章节§6.3.2.1(强调我的)

除非它是运算sizeof符,_Alignof运算符或一元运算&符的操作数,或者是用于初始化数组的字符串文字,否则类型为''数组'的数组的表达式转换为类型为''的表达式指向类型''的指针指向数组对象的初始元素,而不是左值.

但是,正如评论中所提到的那样C++11,这不再有效,因为字符串文字是const char[]那里的类型,在你的情况下,LHS缺少说明const符.

OTOH,

 int *c= 1;
Run Code Online (Sandbox Code Playgroud)

是无效的(非法的)因为,1是一个整数常量,与它的类型不同int *.

  • @RemyLebeau它在C++ 03中被弃用,而在C++ 11中则出错 (3认同)

Lun*_*din 5

在 C 和非常旧的 C++ 版本中,字符串文字"abcd"的类型char[]是字符数组。这样的数组自然可以由 a 指向char*,但不能由 a指向,int*因为它不是兼容的类型。

但是,C 和 C++ 是不同的,通常是不兼容的编程语言。大约 20 年前,他们放弃了彼此的兼容性。

在标准 C++ 中,字符串文字是类型的const char[],因此您发布的代码在 C++ 中都无效。这不会编译:

char* b = "abcd";        //invalid, discards const qualifier
Run Code Online (Sandbox Code Playgroud)

这会:

const char* c = "abcd";  // valid
Run Code Online (Sandbox Code Playgroud)