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

时间:2013-06-18 04:24:27

标签: c++ c

我可以知道为什么这项任务可能吗?

char const *c = "Hello";
c = "there!";

是否指向无法修改其内容的位置。据我所知,它正在创造另一个对象并使c指向它。是真的吗

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

6 个答案:

答案 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关键字即可。