我可以知道为什么这项任务可能吗?
char const *c = "Hello";
c = "there!";
是否指向无法修改其内容的位置。据我所知,它正在创造另一个对象并使c指向它。是真的吗
对此的任何其他重点将不胜感激。
答案 0 :(得分:4)
是的,const
适用于它左边的任何内容(除非它左边没有任何内容)。
您只是将c
指向另一个字符串。
答案 1 :(得分:4)
如同许多答案已经陈述const char *c
的内容如下:
c是指向const char的指针
如果您不熟悉指针,则指针会将某个“对象”的地址保存在内存中。
你的两个字符串,“你好”和“那里!”是字符串文字。在编译时(减去编译器优化),它们被放置在代码的text / rodata段中。不确定您是否熟悉内存中可执行文件的布局(也称为运行时环境),但您有文本,数据,BSS,堆和堆栈。
在运行时,char指针在堆栈上分配,并且首先设置为指向内存中字符串“Hello”所在的区域,然后在第二个语句中,指针设置为指向“那里! “
这两个字符串在内存中实际上是一个连续的字节块,而你的指针只指向一个字符串的开头,然后指向另一个字符串。
所以即使看起来好像是在堆栈上创建这些字符串,实际情况并非如此。
另一方面,如果你声明了字符串如下,
char ch[] = "Hello";
然后你无法重新指定ch
指向“那里”,因为在这种情况下ch是non-modifialble l-value
。
这有点超出了您的问题,但希望它能帮助您了解代码的内容。
答案 2 :(得分:0)
char const *c = "Hello";
是指向常量的指针。这意味着该指针指向的内容无法修改,但可以修改指针以指向不同的内存位置。
注意“Hello”是一个字符串文字。即使给出char *c = "Hello";
,尝试修改内容也是未定义的行为。即c[0] = 'x'
。
答案 3 :(得分:0)
从右到左阅读以正确解释声明:c
是指向常量char
的指针。
答案 4 :(得分:0)
char const *c = "Hello";
这是一个指针到一个常量,
不是常量指针 char * const c = "Hello";
如果指针到常量,则无法使用指针更改指向的值
比如,*c[3] = 't';
等。
在常量指针的情况下,您无法更改指针指向的内容。 像这样,
c = "there!";
另见this。
答案 5 :(得分:0)
编码时
char const* c1 = "Hello";
“Hello”将存储在只读存储器中(字符串文字进入只读存储器),指针c1将存储在堆栈中。
因此无法修改只读内存中的字符串(在本例中为“Hello”),但是可以使C1指向存储在只读内存中的其他字符串。
这就是你在第二行代码中所做的。
另外,只需删除const关键字即可。