使用const修饰的变量,代表只读,不可以修改,如下面程序,运行的时候就可以发现,编译不过, const是在编译期起作用的.
int main(){
const int i = 10;
i = 11;
return 0;
}
当使用const 的时候,编译器会自动将代码优化,在编译器将其出现的地方自动使用初始值替换掉,所以使用的时候, 二进制代码中都已经是被替换的初始化的值,而不是这个变量实际内存的值, 这就是常量折叠, 一个简单的例子:
#include <stdio.h>
int main()
{
const int i = 10;
int* pi = (int*)(&i);
*pi = 100;
printf("*pi: %d\n",*pi);
printf("i: %d\n",i);
printf("pi: %p\n",pi);
printf("&i: %p\n", &i);
return 0;
}
=====输出=======
*pi: 100
i: 10
pi: 0x7ffd78bd3a9c
&i: 0x7ffd78bd3a9c
虽然两者的地址完全一样, 但是值却不同,这是因为const变量的值并不是从内存中查询出来的,而是在编译期间直接被改成了10
由于使用指针可能修改const值, 又避免const值直接是代码写死,关键字volatile便出现作用了,它规定每次去取值的时候必须要去变量的内存取,所以如下代码的两个值打印出来是相等的
#include <stdio.h>
int main()
{
const int i = 10;
int* pi = (int*)(&i);
*pi = 100;
printf("*pi: %d\n",*pi);
printf("i: %d\n",i);
printf("pi: %p\n",pi);
printf("&i: %p\n", &i);
return 0;
}
=====输出=======
*pi: 100
i: 100
pi: 0x7ffd78bd3a9c
&i: 0x7ffd78bd3a9c