Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于c+中字符指针的混淆+; 我是C++语言的新手,我想了解指针的概念。_C++_C_Pointers - Fatal编程技术网

关于c+中字符指针的混淆+; 我是C++语言的新手,我想了解指针的概念。

关于c+中字符指针的混淆+; 我是C++语言的新手,我想了解指针的概念。,c++,c,pointers,C++,C,Pointers,我有一个关于字符指针的基本问题 我知道指针是一个存储地址值的变量, 所以当我写这样的东西时: char * ptr = "hello"; 根据我的基本知识,我认为在=之后应该有一个地址分配给指针,但这里我们分配“hello”,它是一组字符。 那这意味着什么呢? 指针ptr是否指向存储“hello”的地址?或者它存储hello本身吗? 我很困惑,希望你们能帮我 提前谢谢 ptr保存文本“hello”存储的地址。在本例中,它指向一个字符串文本。它是一个位于静态(最常见的只读)内存中的不可变字符数组

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

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

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”的地址。更准确地说,它指向“hello”中的“h”。

编译器将“找到某个地方”,它可以将字符串
“hello”
,而
ptr
将具有该“某个地方”的地址.

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


但是,数组是常量,因此将其分配给
char*
(而不是
const char*
)是一个非常糟糕的主意。您将得到未定义的行为(通常是访问冲突)如果您试图使用该指针修改字符串。

当您通过分配字符串文字来创建新的char*时,所发生的情况是char*被分配了文字的地址。因此char*的实际值可能是0x87F2F1A6(某些十六进制地址值)。char*指向开始(在本例中为第一个char)在C和C++中,所有字符串都以A/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[]
指向字符串文字的指针不会引起问题,但这是不必要的,因为据我所知,它实际上并没有删除它。

这里有一篇类似的帖子,有很多很好的解释:可能是重复的。+1从来没有想过这一点,但我想你是对的,只要你想更改一个字符*你最终还是会创建一个新的。威尔C优化所有的时间?还是只在内存不足的时候才这样做?@约翰,如果这种优化发生,它在运行时就不做了,所以内存占用不是一个因素。关于C不知道,但是在C++中,如果你优化了空间,两个文字都可以看到翻译单元,我敢肯定大多数编译器会优化这个例子。nds在编译器和编译器设置上决定是否将重复的字符串文本折叠为单个字符串。例如,Microsoft的C/C++编译器提供了用于控制此行为的编译器选项。
“Hello”
在您的情况下是
字符串文本
,并且几乎总是
数据段中的
只读
。如果您尝试修改它们,则很可能会出现
segfault
。唯一的“修改”方法是是让指针指向其他东西。是的,但出于演示目的,这很像分配数组。事实上,我明白了我的误导之处,让我编辑一下我的答案。我从来没有说过它会或不会“很像分配数组”,我只是指出您有一个错误的部分(关于修改字符串文字)是的,我意识到我在修改上错了,我想我从原始答案中得到了所有这些。你说的方式听起来好像指针总是某种十六进制值。它们不是十六进制值,它们只是32位或64位无符号整数。十六进制只是一种写它们的方式,你也可以用二进制、八进制表示地址,十进制或任何其他基。@rsethc就像您可以有16位指针一样。它是特定于体系结构的。是的,任意数量的