指针存储字符串?

Pointer stores strings?

本文关键字:字符串 存储 指针      更新时间:2023-10-16

我最近开始学习C++,并遇到了指针的概念(指针是存储另一个变量地址的变量(。然而,我也遇到了char* str = "Hello",我变得困惑。所以看起来"Hello"被分配给指针str(我认为它只能存储地址(。那么指针也可以存储字符串吗?

为了将来参考,您应该只使用您正在使用的语言的语言标签。C 和 C++ 是两种非常不同的语言,在这种情况下是有区别的。

首先是公共部分:像"Hello"这样的文字字符串由编译器存储为数组。在"Hello"的情况下,它是一个包含六个char元素的数组,包括字符串 null 终止符。

现在对于不同的部分:C++这样的字符串文本数组是常量的,则无法修改它们。因此,将非常量指针指向此类数组是错误的。在 C 中,字符串文字数组不是常量,但它们仍然是不可修改的,它们本质上是只读的。但它仍然允许有一个指向它们的非常量指针。

最后回答你的问题:与所有数组一样,使用它们会使它们衰减成指向它们的第一个元素的指针,这基本上就是这里发生的事情。使变量str指向字符串文本数组中的第一个元素。

稍微简化一下,可以这样看(在 C中(:

char anonymous_literal_array[] = "Hello";
...
char *str = &anonymous_literal_array[0];  // Make str point to first element in array

指针将存储字符串开头的地址,因此是第一个字符。在这种情况下,"Hello"是一个不可变的文字。(检查差异:不可变与常量(

更准确地说,指针不能存储字符串以及任何内容,指针可以指向包含指针类型数据的地址。

由于char*是指向char的指针,它正好指向一个char

在此示例中,指针是字符串中第一个字符的地址。这是从 C 继承而来的,其中"字符串"是以 NULL 字符结尾的字符数组。在 C 和 C++ 中,数组和指针密切相关。当您执行自己的内存管理时,通常会创建一个数组,其中包含指向数组第一个元素的指针。这正是保存字符串文字"Hello"的数组正在发生的事情。

在 C/C++ 字符串中存储为字符数组。像"Hello"这样的文字字符串实际上返回保存此字符串的临时只读字符数组的开头。

char* 变量是指向内存中单个字节(char(的指针。处理字符串的最常见方法称为 c 样式字符串,其中 char* 是指向字符串中第一个字符的指针,后跟内存中的其余字符。c 字符串将始终以"\0"或空字符结尾,表示您已到达字符串的末尾("H"、"e"、"l"、"l"、"o"、"\0"(。

"Hello">称为字符串文字。内存中发生的事情是在程序的最开始,在运行其他任何内容之前,程序会为其他静态常量所在的"Hello"字符串分配并设置内存。当你写字符* str ="你好"时;编译器知道您使用的是字符串文本,并将str设置为该字符串文本的第一个字符的位置。

但要小心。所有字符串文本都存储在无法写入的内存部分。如果尝试修改该字符串,则可能会收到内存错误。为了确保这种情况不会发生,在处理 c 字符串时,您应该始终编写const char* str = "Hello";这样,编译器将永远不会允许您修改该内存。

要获得可修改的字符串,您需要自己分配和管理内存。我建议使用 std::string,或者玩得开心,制作自己的字符串类来处理内存。