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

Constants in C: declaration separate from definition

全部C代码:

为什么允许这样做:

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

    i=&j;
}

但不是这个:

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

    i=j;
}

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

const int *i表示i指向的intconst,所以不能做*i = j。但是 const int i 意味着 i 本身就是 const 所以你必须像 const int i = 2; 一样声明它然后它仍然是 const 并且不能被触摸。

区别在于你改变了什么。如果你有一个 const 整数——它不能被改变,如果你有一个指向 const 整数的指针——并且指针不是 const,那么,那个指针可以被分配给指向任何你想要的int

回答你的问题:不,你不能定义一个 const int 然后重新定义它。这否定了 const.

的含义

从语义上讲,第一个示例的意思是 "a pointer to a const int" 而不是 "a const pointer to an int"。

因此,当您将 i 设置为指向 j(非常量整数)时。 i 现在指向一个 const,因此你不能通过指针 i 改变 j 的值,例如:

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

    i=&j;

    *i = 4;
}

无法编译,给出错误 "assignment of read-only location ‘*i’"。因此指针限制了您对所指向的值的访问。但是指针本身还是可以改变的。

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 标准中可能未定义。