将字符串字面值赋值给指向const char的指针

3

请问为什么这个任务是可行的?

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

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

如果有其他亮点,请指出。


你没有修改 *c 的内容;你是指向一个新的(且不可更改的)位置... - Floris
1
c 是一个指向不可修改字符的指针...没有理由它不能指向不同的不可修改字符。"它正在创建另一个对象" - 不完全是这样;字符串字面量已经在内存中(在程序加载时加载),这只是将 c 设置为其地址。 - Jim Balter
6个回答

5

像其他答案已经说明的那样,const char * c 的意思是:

c 是一个指向 const char 的指针。

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

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

在运行时,char指针在堆上分配,首先被设置为指向内存中字符串“Hello”的区域,然后在第二个语句中,指针被设置为指向“there!”。

这两个字符串在内存中实际上是连续的一系列字节,并且你的指针只是依次指向它们的开头位置。

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

另一方面,如果你使用以下方式声明该字符串:

char ch[] = "Hello";

如果是这样,你就无法将ch重新分配指向"There",因为在这种情况下,ch是一个不可修改的l值

这可能超出了您的问题范围,但希望它能帮助您更好地理解代码的实现原理。


4

是的,const适用于其左侧的任何内容(除非它左侧没有内容)。

你只是将c指向了一个不同的字符串。


6
不,const 应用于它左边的任何内容,除非左边没有内容,这种情况下它将应用于它右边的内容。在这种情况下,const 应用于 char 而不是 * - Carl Norum

0

char const *c = "Hello"; 是一个指向常量的指针。这意味着该指针指向的内容不能被修改,但是指针可以被修改以指向不同的内存位置。

请注意,“Hello”是一个字符串字面值。即使给出char *c = "Hello";,尝试修改内容也是未定义的行为。例如c[0] = 'x'


0
从右到左阅读以正确解释声明: c 是指向常量 char 的指针。

0
char const *c = "Hello";

这是一个指向常量的指针,

而不是一个常量指针 char * const c = "Hello";

在指向常量的情况下,不能使用指针更改所指向的值 例如,*c[3] = 't'; 等。

只有在常量指针的情况下,才无法更改指针指向的内容。 就像这样,

c = "there!";

也请参考this


0
当你编写代码时,
       char const* c1 = "Hello";

"

“Hello”将被存储在只读内存中(字符串字面量存储在只读内存中),指针c1将被存储在堆栈中。

因此,只读内存中的字符串(例如此处的“Hello”)无法修改,但是您可以使C1指向存储在只读内存中的其他字符串。

这就是您在代码的第二行中所做的。

另外,尝试仅删除const关键字进行相同的操作。

"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接