将字符串文字分配给指向 const char 的指针

Sak*_*ham 3 c c++

我可以知道为什么这个任务是可能的吗?

char const *c = "Hello";
c = "there!";
Run Code Online (Sandbox Code Playgroud)

是不是指向一个不能修改内容的位置。据我所知,它正在创建另一个对象并使 c 指向它。是真的吗。

对此的任何其他亮点将不胜感激。

ffh*_*dad 5

就像许多答案已经说明的那样const char *c,阅读如下:

c 是一个指向 const char 的指针

如果您不熟悉指针,指针会保存内存中某个“对象”的地址。

你的两个字符串,“你好”和“那里!” 是字符串文字。在编译时(减去编译器优化),它们被放置在代码的 text/rodata 段中。不确定您是否熟悉内存中可执行文件的布局(也称为运行时环境),但您拥有文本、数据、BSS、堆和堆栈。

在运行时,char 指针在堆栈上分配,并首先设置为指向字符串“Hello”所在的内存区域,然后在您的第二个语句中,将指针设置为指向“那里!”

这两个字符串实际上都是内存中的一个连续字节块,您的指针只是指向一个的开始,然后指向另一个。

因此,即使看起来好像您是在堆栈上创建这些字符串,但实际上并非如此。

另一方面,如果您已按如下方式声明字符串,

char ch[] = "Hello";
Run Code Online (Sandbox Code Playgroud)

那么你不能重新分配ch指向“那里”,因为non-modifialble l-value在这种情况下ch 是 a 。

这有点超出了您的问题,但希望它可以帮助您更多地了解代码的内幕。