所以从我的理解指针变量指向一个地址。那么,以下代码如何在C ++中有效?
char* b= "abcd"; //valid
int *c= 1; //invalid
答案 0 :(得分:7)
第一行
char* b= "abcd";
在C中有效,因为“字符串文字”虽然用作初始化程序,但归结为文字中第一个元素的地址,这是一个指针(char
)。
相关,C11
,章节§6.4.5,字符串文字,
[...]多字节字符 然后,序列用于初始化静态存储持续时间和长度的数组 足以包含序列。对于字符串文字,数组元素具有 键入
char
,并使用多字节字符的各个字节进行初始化 序列。 [...]
然后,章节§6.3.2.1(强调我的)
除非,它是
sizeof
运算符,_Alignof
运算符或者&
运算符的操作数。 一元C++11
运算符,或是用于初始化数组的字符串文字,一个表达式 type ''类型''的数组被转换为类型''指向类型''指针的表达式 到数组对象的初始元素,而不是左值。
但是,正如评论中所提到的,在const char[]
之后,由于字符串文字的类型为const
,因此它不再有效,在您的情况下,LHS缺少 int *c= 1;
说明符。
OTOH,
1
无效(非法),因为int *
是一个整数常量,与Varchar
的类型不同。
答案 1 :(得分:4)
在C和非常旧版本的C ++中,字符串文字"abcd"
的类型为char[]
,即字符数组。这样的数组自然可以由char*
指向,但不能由int*
指向,因为它不是兼容的类型。
但是,C和C ++是不同的,通常是不兼容的编程语言。大约20年前,它们之间的兼容性下降了。
在标准C ++中,字符串文字的类型为const char[]
,因此您发布的代码中没有一个在C ++中有效。这不会编译:
char* b = "abcd"; //invalid, discards const qualifier
这将:
const char* c = "abcd"; // valid
答案 2 :(得分:1)
"abcd"
实际上是一种const char[5]
类型,语言允许将其分配给const char*
(令人遗憾的是,char*
虽然C ++ 11以上不允许它。)。
int *c = 1;
,因为您无法将int
分配给int*
指针(0
除外),并且在这种情况下,通过指定nullptr
来表达您的意图。
答案 3 :(得分:0)
"abcd"
是包含五个字节97 98 99 100 0
序列的地址 - 您无法看到源代码中的地址,但编译器仍会为其分配一个地址。
1
也是[虚拟]内存底部附近的地址。这似乎对您没有用,但它是useful to other people,所以即使"标准"可能不想允许这样做,你可能遇到的每个编译器都会支持这个。
答案 4 :(得分:0)
虽然所有其他答案都能正确回答代码无效的原因,但使用复合文字来初始化c
,这是一种可以使代码正常工作的方法,例如
int *c= (int[]){ 1 };
printf ("int pointer c : %d\n", *c);
请注意,在使用复合文字时,C和C ++之间存在差异,它们仅在C中可用。