我可以知道为什么这个任务是可能的吗?
char const *c = "Hello";
c = "there!";
Run Code Online (Sandbox Code Playgroud)
是不是指向一个不能修改内容的位置。据我所知,它正在创建另一个对象并使 c 指向它。是真的吗。
对此的任何其他亮点将不胜感激。
就像许多答案已经说明的那样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 。
这有点超出了您的问题,但希望它可以帮助您更多地了解代码的内幕。