常量字符指针赋值

6
以下的任务分配是否有效?或者这些任务分配中是否有任何问题?请提供建议。
const char * c1;  
const char * c2; 
const char * c3;
char * c4;

c2 = c1;
c2 = c3;
c2 = c4;

如果我按照以下方式操作,是否是可行的呢?
const char * c5 = "xyz";
char * c6 = "abc";

c2 = c5;
c2 = c6;

@ Kshitij Mehta - 这不是作业,我们的代码库非常庞大,我们遇到了内存问题。所以任何帮助将不胜感激。 - user32262
@user 你已经问了几次同样的问题。我们已经一遍又一遍地回答了你。你对这个问题的编辑没有任何贡献,只是重复了你之前问过的内容。 - David Heffernan
1
如果我在问同样的问题,我很抱歉。也许我的指针理解不够准确。 - user32262
也许你可以尝试解释一下你正在努力理解的内容。我认为你需要尝试不同的方法,因为每次问相同的问题都会得到相同的答案!;-) 尝试用不同的方式表达自己。 - David Heffernan
4个回答

40
在你的脑海中通过星号划一条线。左边是被指向的内容,右边表示指针类型。
例如:
  1. const char * const p - 指针 p 是常量,指向的字符也是常量——既不能更改指针,也不能更改指针所指向的内容。
  2. const char * p - p 指向常量字符,可以更改 p 的值并使其指向不同的常量字符,但无论 p 指向什么,都不能更改其内容。
  3. char * const p - 无法更改指针,但可以更改其所指向的内容。
最后,
  1. char * p - 一切皆可更改。
希望这有所帮助。

第一个例子中你是不是想要两个 * 符号? - Martin Thompson
非常清晰。好帖子。我正在搜索为什么我可以更改const char* ptr作为输入参数,这篇文章完美地解释了这一点。我还需要等待40分钟才能再投票,所以之后我会点赞。 - stevieb
没有这个答案,我永远不会理解2和3之间的区别。 - Joey Liu

9
所有这些语句都是有效的,只要你不解引用它们,因为所有指针都未初始化或未指向任何有效的内存位置。
它们是有效的,因为指针不是常量,但指针指向的值是常量。所以,在这里指针可以被重新分配指向不同的位置。

3
这些作业都是完全有效的,正如我和其他人在您最近一系列几乎相同的问题中所解释的那样。 const char*是指向内存的指针,不能使用该指针进行修改。没有任何东西可以规避这一点。如果您分配 c4 = c1,编译器会反对,因为那样就规避了常量。

0
所有这些都是有效的,唯一有问题的行是char * c6 = "abc";:这里的"abc"是一个const字面量,所以将其赋值给非const指针是不安全的,如果没有编译错误,至少应该生成一个警告(我没有尝试编译它)。

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