我是c ++语言的新手,我正在尝试理解指针概念。
我有一个关于char指针的基本问题,
我所知道的是指针是一个存储地址值的变量, 所以当我写这样的时候:
char * ptr = "hello";
根据我的基本知识,我认为在=
之后应该有一个地址分配给指针,但是在这里我们分配“hello”这是一组chars。
那是什么意思呢?
指针ptr
是否指向存储“hello”的地址?或者它本身存储你好?
我很困惑,希望你们能帮帮我..
提前致谢。
答案 0 :(得分:12)
ptr
保存文字"hello"
存储位置的地址。在这种情况下,它指向一个字符串文字。它是位于静态(最常见的只读)内存中的不可变字符数组。
您可以通过重新分配来使ptr
指向其他内容,但在此之前,修改内容是非法的。 (其类型实际上是const char*
,对于C兼容性,不推荐转换为char*
(在C ++ 11中甚至是非法的)。
由于这种保证,编译器可以自由地优化空间,所以
char * ptr = "hello";
char * ptr1 = "hello";
可能产生两个相等的指针。 (即ptr == ptr1
)
答案 1 :(得分:6)
指针指向存储“hello”的地址。更确切地说,它将'h'指向“你好”。
答案 2 :(得分:2)
"hello"
是一个字符串文字:一个静态字符数组。与所有数组一样,如果它在需要指针的上下文中使用,它可以转换为指向其第一个元素的指针。
但是,数组是常量,因此将其分配给char*
(而不是const char*
)是一个非常糟糕的主意。如果您尝试使用该指针修改字符串,则会得到未定义的行为(通常是访问冲突)。
答案 3 :(得分:1)
编译器会在某处找到"它可以放置字符串"hello"
,而ptr
将具有该地址"某处"。
答案 4 :(得分:0)
当您通过为其指定字符串文字来创建新的char *时,会发生的情况是为char *分配文字的地址。所以char *的实际值可能是0x87F2F1A6(一些十六进制地址值)。 char *指向字符串的开头(在本例中为第一个char)。在C和C ++中,所有字符串都以/ 0结尾,这就是系统知道它已经到达String结尾的方式。
答案 5 :(得分:0)
char* text = "Hello!"
可以被认为如下:
在程序启动时,您将创建一个长度为7的字符数组:
{'H','e','l','l','o','!','\0'}
。最后一个是空字符,表示后面没有任何字符。 [它比保持与字符串关联的计数更有效...对于32位整数,计数可能占用大约4个字节,而空字符只占一个字节,如果使用Unicode字符串则占两个字节。另外,单个数组以空字符结尾比不必同时管理字符数组和计数变量更容易让人感到困惑。]
创建数组和使字符串保持不变之间的区别在于数组是可编辑的,而字符串常量(或“字符串文字”)则不是。尝试在字符串文字中设置值会导致问题:它们是只读的。
然后,每当您调用语句char* text = "Hello!"
时,您将获取该初始数组的地址并将其粘贴到变量text
中。请注意,如果你有这样的东西......
char* text1 = "Hello!";
char* text2 = "Hello!";
char* text3 = "Hello!";
...那么你很可能正在创建三个独立的{'H','e','l','l','o','!','\0'}
数组,所以这样做会更有效...
char* _text = "Hello!";
char* text1 = _text;
char* text2 = _text;
char* text3 = _text;
大多数编译器都足够智能,只能自动初始化一个字符串常量,但有些编译器只会在您手动启用某些优化功能时执行此操作。
另一个注意事项:根据我的经验,在指向字符串文字的指针上使用delete []
不会导致问题,但这是不必要的,因为据我所知它实际上并没有删除它。