void main()
{
const int * a;
*a = 5;
}
gcc错误:指定只读位置。
那么,如何在不使用其他变量的情况下分配给* a? 什么可以使用上面的声明?
答案 0 :(得分:10)
const int * a;
从右到左阅读声明。[见注释]你得到了什么? a
是*
,即指向int
的指针,即整数const
,即常数。简而言之,变量a
指向一个整数,其值不能更改。至少,不是通过a
。指针对象是否真的是不可变的是一个不同的问题。但事实仍然是,您无法使用a
修改*a
;
const
是你对自己的承诺:我永远不会尝试使用指向const的指针来修改指针。编译器只为您提供支持。
如果你真的想要写入指针,你需要一个非const指针,如:
int *a;
*a = 42; /* this is fine */
来自bortzmeyer的一个非常好的评论:(我以为我会跳过这个来保持简单:)
您也可以将
const
放在*
之后(如您所说,声明应该从右到左阅读。)
他的意思是:
const int *a;
与
没有什么不同int const *a;
(请记住,从右到左阅读规则?) 但与以下内容截然不同:
int * const p;
阅读它我们得到:p
是const
( - 蚂蚁)*
(指针)int
( - eger)。翻译:一旦你设置p
指向一个整数,你就不能重新设置它(即写入它使它指向另一个整数 - 使p
不变的点),但你可以写很多指针(指针不是常数)。
注意:对于迂回倾向的人来说,Darron来自“{规则”:
“声明应该从右到左阅读”是一种简化 - 如果有括号,则应从内到外阅读。除非括号表示函数调用。真正的规则是“将其视为表达;如果我应用这些运算符,我将最终得到这种简单类型”。
对于 bortzmeyer 和 Darron ,这个答案真的会少得多 - 谢谢!
PPS:(我保证这将是最后一次编辑。好吧,希望!)
void main()
不是C或C ++中main的标准签名。在你认识自己之前不要使用它,或者(更重要的是)你的代码将永远无法前往另一个宇宙。
答案 1 :(得分:2)
一个例子说明了Ruben Bartelink的出色解释:
#include <stdlib.h>
int main()
{
int * const a = malloc(sizeof(int));
if (a == NULL)
return 1;
*a = 3;
free(a);
return 0;
}
这里,a是常数(因此必须初始化)但不是* a(可能是OP想要的)。
答案 2 :(得分:2)
让我把你的问题简单化为英文。
答案:改变承诺,至少在当地。
int main()
{
const int * a;
*((int *) a) = 5;
}
希望上面的措辞清楚地表明这通常是一个坏主意。
答案 3 :(得分:1)
您的意思是int * const
,而不是const int *
。在一种情况下,指针是const,另一种是它指向的东西是const。您也可以const int * const
。阅读一些关于const_cast的文章没有坏处,它们应该很好地涵盖这一点。
答案 4 :(得分:0)
您不能指定const
的分数吗?虽然,我不记得const指针的情况,如果它指向的值不能改变,或指针的地址。或两者。我的猜测是两者都无法改变。
它也可能是您尝试写入未初始化内存的一般警告(或错误,具体取决于编译器设置)。
正确(我假设):
void main()
{
const int* a = new int(5);
}
答案 5 :(得分:0)
没有回答“如何分配给* a,而不使用其他变量?”但只是“什么可以使用上面的声明?”。
承诺不修改指向的值。正如评论中所讨论的那样, if 你对允许自己使用构造的方式进行限制,你可以得出它没有用的结论。但如果您允许自己使用整个C语言,那么您可以找到用途。想想strcmp
等原型。
答案 6 :(得分:-2)
问题是你已经创建了一个指针,但它实际上并没有指向任何东西,所以当你取消引用它(或者尝试写入它引用的loaction)时,你会得到一个错误。