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

时间:2017-04-28 07:31:46

标签: c++ c pointers initialization

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

char* b= "abcd"; //valid
int *c= 1; //invalid

5 个答案:

答案 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以上不允许它。)。

C ++或C标准不允许

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中可用。