sor*_*kie 0 c c++ pointers initialization
所以从我的理解指针变量指向一个地址.那么,以下代码如何在C++中有效?
char* b= "abcd"; //valid
int *c= 1; //invalid
Run Code Online (Sandbox Code Playgroud)
第一行
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 *.
在 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)