c++ 指针存储字符串?

bnlyeluc  于 2023-01-18  发布在  其他
关注(0)|答案(5)|浏览(235)

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

gcmastyq

gcmastyq1#

为了便于以后参考,你应该只使用你正在使用的语言的语言标签。C和C是两种非常不同的语言,在这种情况下,有一个区别。
首先是公共部分:像"Hello"这样的字符串被编译器存储为数组,对于"Hello",它是一个包含6个char元素的数组,包括字符串空终止符。
现在是不同的部分:在C
中,这样的字符串数组是 constant,它们不能被修改。因此,使用非常量指针指向这样的数组是错误的。在C中,字符串数组是 not constant,但它们仍然是不可修改的,本质上它们是只读的。但仍然允许使用非常量指针指向它们。
最后回答你的问题:和所有的数组一样,使用它们会使它们退化为指向第一个元素的指针,这就是这里发生的事情,你让变量str指向字符串数组中的第一个元素.
稍微简化一下,可以看到如下所示(在C中):

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

xzlaal3s2#

指针将存储字符串的起始地址,也就是第一个字符。在本例中,“Hello”是一个不可变的文本。(Check the difference: Immutable vs constant
更准确地说,指针不能存储字符串以及任何东西,指针可以指向包含指针类型数据的地址。
因为char*是指向char的指针,所以它正好指向char

wbgh16ku

wbgh16ku3#

在这个例子中,指针是字符串中第一个字符的地址。这是从C语言继承而来的,在C语言中,“string”是以NULL字符结尾的字符数组。在C和C++中,数组和指针是紧密相关的。当你自己管理内存时,你经常创建一个数组,并给它的第一个元素加上一个指针,这就是这里的数组,包含字符串常量"Hello"的情况。

disbfnqx

disbfnqx4#

在c/c++中,字符串是以字符数组的形式存储的。2像“Hello”这样的字符串实际上是返回包含该字符串的临时只读字符数组的开头。

pb3s4cty

pb3s4cty5#

char* 变量是指向单个字节的指针(char)。处理字符串最常用的方法称为c-样式字符串,其中char* 是指向字符串中第一个字符的指针,后面跟有内存中的其余字符。c-字符串总是以'\0'或空字符结尾,表示已到达字符串结尾(“H”、“e”、"l"、“l”、“o”、“\0”)。

  • “Hello”* 被称为字符串文字。内存中发生的事情是在程序的最开始,在其他任何东西运行之前,程序为“Hello”字符串分配和设置内存,其他静态常量位于那里。当你写 char str =“Hello”;* 编译器知道你使用的是字符串常量,并将 str 设置为该字符串常量的第一个字符的位置。

但是要小心。所有字符串都存储在内存中不能写入的部分。如果你试图修改那个字符串,你可能会得到内存错误。为了确保不会发生这种情况,在处理c字符串时,你应该总是写 const char str =“Hello”;* 这样,编译器就永远不会允许您修改该内存。
要有一个可修改的字符串,你需要自己分配和管理内存。我建议使用std::string,或者有一些乐趣,使自己的字符串类来处理内存。

相关问题