关于 C++ 中字符指针的混淆
confusion about char pointer in c++
我是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 []
不会导致问题,但这是不必要的,因为据我所知,它实际上并没有删除它。
- 指向指向字符数组的指针数组的指针
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将字符缓冲区强制转换为函数指针
- 在函数中返回无符号字符数组,但不返回指针
- 将字符逐个分配给指针?
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 如何循环访问 cpp 中的函数返回的字符指针数组
- 将字符数组复制到 QByte 数组中,而无需传递指针
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- C++指针数组到字符数组中的特定位置
- 如何从链表指针字符中查找字符
- 获取字符数组地址,然后转换为指针字符
- 在指针字符 c++ 中分配字符数组的值
- C 指针字符
- 将向量传递<char>到指针字符*
- 如何修复未对齐的指针(字符**)
- 如何打印指针字符数组
- 指针 *字符和 &字符
- C++指针字符
- C/ c++:从指针字符一维数组中访问单个字符