我的理解是它应该包含一个字符变量的内存地址,但现在我看到它也可以用来创建字符串?例如:
char* ptr = "string";
当ptr本应该保存一个内存地址时,它如何被赋予一个字符串?我认为需要使用解引用运算符来更改所指向的值,难道不是吗?
"string"
是一个const char[7]
类型的字面量。C++允许您使用兔子耳朵来简化语言。为您添加了0终止符,这就是为什么有7个元素而不是6个。
在各种情况下,数组类型会衰减为指针类型,指针设置为数组的第一个元素。赋值是其中之一。这就是这里发生的事情。
从C++11开始,严格来说,您的C++编译器不应编译该语句。它应该是
"const char* ptr = "string";
char*
确实指向单个char
。+-----+
| ptr |
+--+--+
|
v
+-+-+---+---+---+---+---+----+
| s | t | r | i | n | g | \0 |
+---+---+---+---+---+---+----+
ptr
指向"string"
开头的's'
字符。通过将1
添加到ptr
,您可以找到't'
等字符。这就是内置的[]
运算符所做的事情。ptr[2]
被定义为相当于*(ptr + 2)
: 将指针偏移2个位置,然后获取结果所指向的值。
'\0'
字符用于标记字符串的结尾,以便使用该字符串的代码知道停止查找更多字符。
operator<<(std::ostream&, const char*)
,当 cout << ptr
调用它时,会打印整个字符串。而 cout << *ptr
则调用了 operator<<(std::ostream&, char)
,打印单个字符。如果你想打印 ptr
中包含的地址,请使用 cout << static_cast<void*>(str)
。 - Miles Budnek
const char []
左值。事实上,ISO C++禁止像char * ptr =“string”
这样的代码。 - con koconst
指针类型,但是尝试通过指针修改字符串时的行为是未定义的。而在C++中,字符串会衰变为const
指针类型。 - Bathsheba