所有C代码:
为什么允许这样做:
int main()
{
const int *i;
int j=2;
i=&j;
}
但不是这样:
int main()
{
const int i;
int j=2;
i=j;
}
有没有办法声明一个局部常量变量,然后在范围内的其他地方定义它?使用指针的第一种情况是不可靠的,因为我可以多次定义它,首先打败常量关键字的目的。
答案 0 :(得分:1)
const int *i
表示int
指向的i
为const
,因此您无法*i = j
。但const int i
表示i
本身为const
,因此您必须将其声明为const int i = 2;
,然后它仍为const
,且无法触及。
区别在于你改变了什么。如果你有一个const
整数 - 它不能被改变,如果你有一个指向const
整数的指针 - 并且指针不是const
,那么指针可以是分配指向您想要的任何int
。
要回答您的问题:不,您无法定义const int
,然后重新定义它。这否定了const
的含义。
答案 1 :(得分:1)
从语义上讲,第一个例子意味着"指向const int"的指针。不是"指向int"的常量指针。
所以,当你设置i指向j(非const int)时。我现在指向一个const,因此你不能通过指针i改变j的值,例如:
int main()
{
const int *i;
int j=2;
i=&j;
*i = 4;
}
不会编译,给出错误"分配只读位置'* i'和#34;。因此指针限制您对指向的值的访问。但指针本身仍然可以改变。
C是它的语言,并没有真正提供很多保护,你通常可以抛弃const并为变量分配一个新值,例如:。
#include <stdio.h>
void assign(int *a) {
*a=5;
}
int main()
{
int const i=1;
int j=2;
assign((int *) &i);
printf("i: %d\n",i);
}
但我不确定我是否会推荐它。虽然这在某些版本的gcc中有效,但这种行为很可能在C标准中未定义。