今天复习C语言继续踩坑。
一般来说,c语言中用const修饰的常量是无法进行修改的,但是指针可以获取改常量地址,通过地址可以进行修改。准确的来说,c语言中的常量应该是只读变量。
下面代码定义了红色的常量,通过指针修改red值,打印输出指针修改前后的red值。
#includeint main() { const int red = 0xFF0000; printf("source %dn", red); int *p = &red; *p = 0; printf("exchange %dn", red); return 0; }
上面这段代码在mac和windows上运行显示两种不同的结果
在windows上:
在MacOS上:
同样都是通过指针p来修改了red地址所保存的值,为什么macos最后打印的结果还是修改之前的? 并且进行断点调试,red地址的值的确被修改掉了,但输出结果依旧是red原本的赋值。
下图是在macos断点调试中的截图:
第二次打印时,red已经被修改成了0,输出结果却仍是初始的值。
理论来说,const所修饰的常量的确是不允许修改的,但c语言的指针特性使常量变成了只读变量。
macos系统下,编译器对常量进行了优化保护 。认为常量不会被修改,直接把定义的常量的值替换到了最后一次printf输出。
所以定义常量可以使用宏定义
#define RED 0xFF0000
int main(){
// ...
return 0 ;
}
如果我就是必须要在mac上通过指针来修改常量呢?
可以使用volatile关键字来修饰常量。
volatile是一个特征修饰符(type specifier).volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
volatile const int red = 0xFF0000;



