关于 C++ 中字符指针的混淆

confusion about char pointer in c++

本文关键字:指针 字符 C++ 关于      更新时间:2023-10-16

我是C ++语言的新手,我正在尝试理解指针的概念。

我有一个关于字符指针的基本问题,

我所知道的是指针是一个存储地址值的变量,所以当我这样写 sth 时:

char * ptr = "hello";

根据我的基本知识,我认为在=之后应该有一个地址分配给指针,但这里我们分配"hello",这是一组字符。这是什么意思呢?
指针ptr指向存储"hello"的地址吗?还是它存储了 hello 本身?
我很困惑,希望你们能帮助我..

提前谢谢。

ptr将地址保存到存储文字"hello"的位置。在本例中,它指向字符串文本。它是一个不可变的字符数组,位于静态(最常见的是只读)内存中。

您可以通过重新分配ptr指向其他内容,但在此之前,修改内容是非法的。(它的类型实际上是const char*,为了兼容 C,不推荐转换为 char*(甚至在 C++11 中是非法的)。

由于这种保证,编译器可以自由地优化空间,因此

char * ptr = "hello";
char * ptr1 = "hello";

可能会产生两个相等的指针。 (即 ptr == ptr1

指针指向存储"hello"的地址。更准确地说,它是在"你好"中指向"h"。

"hello"是一个字符串文字:一个静态的字符数组。与所有数组一样,如果在需要指针的上下文中使用,则可以将其转换为指向其第一个元素的指针。

然而,数组是常量的,所以把它分配给char*(而不是const char*)是一个非常糟糕的主意。如果尝试使用该指针修改字符串,则会收到未定义的行为(通常是访问冲突)。

编译器

将"找到某个地方",它可以将字符串放在"hello",并且ptr将具有该"某处"的地址。

当您通过为其分配字符串文本来创建新的 char* 时,发生的情况是 char* 被分配文本的地址。因此,char* 的实际值可能是0x87F2F1A6(一些十六进制地址值)。char* 指向字符串的开头(在本例中为第一个 char)。在 C 和 C++ 中,所有字符串都以/0 结尾,这就是系统知道它已到达字符串末尾的方式。

char* text = "Hello!"可以认为如下:

在程序启动时,您创建一个长度为 7 的字符数组: {'H','e','l','l','o','!',''} .最后一个是空字符,表明它后面没有更多的字符。[这比保持与字符串关联的计数更有效...对于 32 位整数,计数可能占用 4 个字节,而空字符只是一个字节,如果您使用的是 Unicode 字符串,则占用两个字节。此外,让单个数组以空字符结尾比必须同时管理一个字符数组和一个计数变量更不令人困惑。

创建数组和使字符串常量

之间的区别在于,数组是可编辑的,而字符串常量(或"字符串文字")不是。 尝试在字符串文本中设置值会导致问题:它们是只读的。

然后,每当你调用语句 char* text = "Hello!" 时,你获取该初始数组的地址并将其粘贴到变量 text 中。请注意,如果您有这样的东西...

char* text1 = "Hello!";
char* text2 = "Hello!";
char* text3 = "Hello!";

。那么你很有可能正在创建三个单独的{'H','e','l','l','o','!',''}数组,所以这样做会更有效......

char* _text = "Hello!";
char* text1 = _text;
char* text2 = _text;
char* text3 = _text;

大多数编译器都足够聪明,只能自动初始化一个字符串常量,但有些编译器只有在手动打开某些优化功能时才会这样做。

另一个注意事项:根据我的经验,在指向字符串文字的指针上使用delete []不会导致问题,但这是不必要的,因为据我所知,它实际上并没有删除它。