3

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

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

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

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

4

6 回答 6

5

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

c 是指向 const char 的指针

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

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

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

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

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

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

char ch[] = "Hello";

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

这超出了您的问题,但希望它可以帮助您更多地了解代码在幕后的样子。

于 2013-06-18T04:54:11.440 回答
4

是的,const适用于它左边的任何东西(除非它的左边没有任何东西)。

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

于 2013-06-18T04:25:48.390 回答
0

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

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

于 2013-06-18T04:29:18.523 回答
0

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

于 2013-06-18T04:34:59.953 回答
0
char const *c = "Hello";

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

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

如果是指向常量的指针,则无法使用指针等更改指向的值*c[3] = 't';

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

c = "there!";

也看到这个

于 2013-06-18T04:53:36.343 回答
0

当你编码时

       char const* c1 = "Hello";

“Hello”将存储在只读内存中(字符串文字进入只读内存),指针 c1 将存储在堆栈中。

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

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

此外,只需删除 const 关键字即可尝试相同的操作。

于 2013-06-18T04:54:09.940 回答