C:中的常量:声明与定义分开

时间:2015-06-06 22:12:08

标签: c gcc constants

所有C代码:

为什么允许这样做:

int main()
{
    const int *i;
    int j=2;

    i=&j;
}

但不是这样:

int main()
{
    const int i;
    int j=2;

    i=j;
}

有没有办法声明一个局部常量变量,然后在范围内的其他地方定义它?使用指针的第一种情况是不可靠的,因为我可以多次定义它,首先打败常量关键字的目的。

2 个答案:

答案 0 :(得分:1)

const int *i表示int指向的iconst,因此您无法*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标准中未定义。