三国演义42回概括:请教一下C语言的问题

来源:百度文库 编辑:高考问答 时间:2024/04/29 01:38:28
请教一下这个问题

#define P_IOA_Data (volatile unsigned int *)0x7000



#define P_IOA_Data 0x7000

有什么区别

还有volatile是什么意思啊?

第一个是个变量存储在内存中
第二个是常量,就是数字,默认类型double

volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错

当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。

通俗的说,就是时刻更新的意思。编译系统可能会优化程序,常用的变量放在CPU的寄存器里运算。这时如果你去内存中寻找这个变量的话,它可能是个意料之外的值。但是如果这个变量用volatile声明的话,每次计算都会直接在内存中读写值。当然对于大多数程序声不声明其实是没太大关系的,只有在调试模式下运行,你可以随时随地看到内存情况的时候,你才能感觉到volative的作用。另外如果这个变量要时刻供其他程序共享,也要声明为volative。

(volatile unsigned int *)表达式之前加“(类型)”表示强制类型转换,这里表示0x7000是一个指向无符号整数的指针。

举个例子
#define i 1;
if(i){
}

编译器可能编译为if(true){ }
而加上volatile编译器则不会做优化处理。