乐趣区

cc中const修饰的变量值变与不变的问题

const关键字是 c /c++ 中比较常用的一个关键字,很多书中都将 const 修饰的变量描述为常量,那么一般情况下,常量是不可被修改的。先看如下代码:

const int a = 10;
a = 11;

此时在一些比较智能的 IDE 环境中,例如 vs2019 会直接在变量 a 下出现红线,显示 表达式必须是可被修改的左值 。这也是确实如书中所说,const 修饰的变量无法被修改。但是接下来看另外一段代码

#include <stdio.h>
int main() {
    const int a = 10;
    int* p = &a;
    *p = 11;
    printf("%d\n", a);
    return 0;
}

上述程序运行结果为 11.

我们通过取得 a 的地址,然后通过指针的方式,重新给 a 赋值,达到了修改 a 的值的目的。这说明 c 语言中的 const 修饰的变量,其值是可以被修改的。其实在 c 语言中,const是通过编译器检查实现的,它标记 const 变量不能直接被修改。但是并未限制 const 变量的地址的引用, 而只要变量的地址存在被引用的可能,就说明该变量是可以通过指针被间接修改的。所以,只要我们能保证程序在编译过程不出错,那么在程序的运行过程中我们便可以通过指针间接修改该 const 修饰的变量的值。

而在 c++const修饰的变量更加表现为常量。无论是直接还是间接都无法修改 const 修饰的变量。

退出移动版