[英]What exactly does a char* mean in C++?
我的理解是它应该包含一个 char 变量的内存地址,但现在我看到它可以用来创建字符串? 例如,
char* ptr = "string";
当要保存内存地址时,如何为 ptr 分配字符串? 我认为需要取消引用运算符来更改所指向的值?
"string"
是一个const char[7]
类型的字面量。 C++ 允许您使用兔子耳朵来简化语言。 为您添加了 0 终止符,这就是为什么有 7 个元素,而不是 6 个。
在各种情况下,数组类型衰减为指针类型,指针设置为数组的第一个元素。 赋值就是这些实例之一。 这就是这里正在发生的事情。
从形式上讲,从 C++11 开始,您的 C++ 编译器不应编译该语句。 它应该是
const char* ptr = "string";
你的理解是正确的; a char*
确实指向单个char
。
诀窍是数组在内存中是连续排列的,因此给定一个指向数组第一个元素的指针,您可以通过向指针添加偏移量来访问其他元素。 在您的示例中,事情看起来(逻辑上)是这样的:
+-----+
| ptr |
+--+--+
|
v
+-+-+---+---+---+---+---+----+
| s | t | r | i | n | g | \0 |
+---+---+---+---+---+---+----+
ptr
指向"string"
开头的's'
。 通过将1
添加到ptr
,您可以找到't'
,依此类推。 这就是(内置) []
操作符所做的。 ptr[2]
被定义为等价于*(ptr + 2)
:将指针偏移 2 个位置,然后获取结果指向的值。
'\\0'
字符用于标记字符串的结尾,以便使用代码知道停止查找更多字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.