const常变量

46 阅读2分钟

C语言中的常变量

    int g_max;//未初始化变量,默认是0
    
    int main() {
        int x;//未初始化变量,默认是随机值
        //编译是不会通过的
        printf("g_max = %d\n x = %d\n", g_max, x);
    
        return 0;
    }

如果改变一下,将g_max变成常变量

    const int g_max;//默认是0
    
    int main() {
        int x;//默认是随机值
        //编译会通过
        printf("g_max = %d\n", g_max);
    
        return 0;
    }
    //不管x是不是const,编译都不会通过
    //另外const int x;不初始化本身也没有意义
    //所以在C语言中如果定义一个局部常变量,一定要进行初始化

另一个例子

    int main() {
        const int len = 10;
        arr[len];
        //编译还是不能通过,数组中[]里面要求是>0的整数,是不可变的,但是尽管这里的变量len被const修饰了,但是c语言还是把它当成了常量,所以编译不能通过
    
        return 0;
    }

C++中

    //编译不会通过,在C++中,全局常变量变量也必须进行初始化
    const int g_max;
    
    int main() {
        const int x;
    
        return 0;
    }
    const int g_max = 0;
    
    int main() {
        const int x = 0;
        const int len = 5;
        int arr[len] = {1, 2, 3, 45};
        //编译是可以通过的
    
        return 0;
    }
    //这里len有点类似宏替换
    //只不过宏替换是在预编译进行的
    //而const是在编译时才进行替换的
    //另外,宏不占空间,没有类型
    //但是const占用空间有类型


有一些比较有意思的,就是修饰指针

    int main() {
        const int num = 1;
        return 0;
    }

现在用const来修饰num这个变量,那么,num是不可修改的
有什么办法能绕过这条限制呢? 用指针

   int main() {
        const int num = 1;
        int* ptr = #
        *ptr = 10;
        printf("%d\n", num);
        return 0;
    } 

image.png 结果是10,尽管已经用const来修饰了,但最终结果还是改变了
这就好比一间房子,你把门锁住了不让别人进来,但是呢,人家不讲武德,从窗户进来了
现在进行改变,我窗户也不让你进

    int main() {
        const int num = 1;
        const int* ptr = #
        *ptr = 10;
        printf("%d\n", num);
        return 0;
}

image.png 没等运行就已经报错了
所以,当const在*的左侧时,是不能通过指针来修改所指向的变量的,但是可以改变指向

再看一种

int main() {
    int n = 20;
    const int num = 1;
    int* const ptr = #
    *ptr = 10;
    ptr = &n;
    return 0;
}

image.png 同样的,如果const在*的右边,指针就不能改变指向,但是可以修改所指变量的值