c/c++中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修饰的变量。

相关推荐