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, 4,5};
//编译是可以通过的
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;
}
结果是10,尽管已经用const来修饰了,但最终结果还是改变了
这就好比一间房子,你把门锁住了不让别人进来,但是呢,人家不讲武德,从窗户进来了
现在进行改变,我窗户也不让你进
int main() {
const int num = 1;
const int* ptr = #
*ptr = 10;
printf("%d\n", num);
return 0;
}
没等运行就已经报错了
所以,当const在*的左侧时,是不能通过指针来修改所指向的变量的,但是可以改变指向
再看一种
int main() {
int n = 20;
const int num = 1;
int* const ptr = #
*ptr = 10;
ptr = &n;
return 0;
}
同样的,如果const在*的右边,指针就不能改变指向,但是可以修改所指变量的值