请问为什么这个任务是可行的?
char const *c = "Hello";
c = "there!";
它不是指向一个内容不能被修改的位置吗?据我所知,它会创建另一个对象并使c指向它。这是真的吗?
如果有其他亮点,请指出。
像其他答案已经说明的那样,const char * c
的意思是:
c 是一个指向 const char 的指针。
如果你不熟悉指针,指针保存内存中某个“对象”的地址。
你的两个字符串,“Hello”和“there!”是字符串字面量。在编译时(减去编译器优化),它们被放置在代码的文本/只读数据段中。不确定您是否熟悉可执行文件在内存中的布局(也称为运行时环境),但您有文本、数据、 BSS、堆和栈。
在运行时,char指针在堆上分配,首先被设置为指向内存中字符串“Hello”的区域,然后在第二个语句中,指针被设置为指向“there!”。
这两个字符串在内存中实际上是连续的一系列字节,并且你的指针只是依次指向它们的开头位置。
因此,即使看起来好像是在堆上创建了这些字符串,但事实上并非如此。
另一方面,如果你使用以下方式声明该字符串:
char ch[] = "Hello";
如果是这样,你就无法将ch
重新分配指向"There",因为在这种情况下,ch
是一个不可修改的l值
。
这可能超出了您的问题范围,但希望它能帮助您更好地理解代码的实现原理。
是的,const
适用于其左侧的任何内容(除非它左侧没有内容)。
你只是将c
指向了一个不同的字符串。
const
应用于它左边的任何内容,除非左边没有内容,这种情况下它将应用于它右边的内容。在这种情况下,const
应用于 char
而不是 *
。 - Carl Norumchar const *c = "Hello";
是一个指向常量的指针。这意味着该指针指向的内容不能被修改,但是指针可以被修改以指向不同的内存位置。
请注意,“Hello”是一个字符串字面值。即使给出char *c = "Hello";
,尝试修改内容也是未定义的行为。例如c[0] = 'x'
。
c
是指向常量 char
的指针。char const *c = "Hello";
这是一个指向常量的指针,
而不是一个常量指针 char * const c = "Hello";
在指向常量的情况下,不能使用指针更改所指向的值
例如,*c[3] = 't';
等。
只有在常量指针的情况下,才无法更改指针指向的内容。 就像这样,
c = "there!";
也请参考this。
char const* c1 = "Hello";
“Hello”将被存储在只读内存中(字符串字面量存储在只读内存中),指针c1将被存储在堆栈中。
因此,只读内存中的字符串(例如此处的“Hello”)无法修改,但是您可以使C1指向存储在只读内存中的其他字符串。
这就是您在代码的第二行中所做的。
另外,尝试仅删除const关键字进行相同的操作。
"
*c
的内容;你是指向一个新的(且不可更改的)位置... - Florisc
是一个指向不可修改字符的指针...没有理由它不能指向不同的不可修改字符。"它正在创建另一个对象" - 不完全是这样;字符串字面量已经在内存中(在程序加载时加载),这只是将c
设置为其地址。 - Jim Balter