在嵌入式的C程序中,我们经常看到类似如下的定义:
#define AAA (*(volatile unsigned char *)0x20)
#define BBB (*(volatile unsigned char *)0x4B000020)
......
那么如何对这条语句进行理解呢?
首先,我们来分析define语句后面的内容: (*(volatile unsigned char *)0x20),首先看到里面使用了关键字volatile和数据类型unsigned char以及C语言中的地址引用符号“*”,将这段代码拆开来看, (unsigned char *)0x20中0x20是一个地址,其存储数据的类型为unsigned char型,即一个8位的二进制数据,如一个8位的寄存器。利用关键字volatile对其进行修饰(volatile unsigned char *)0x20则表示这个地址中存放的数据容易被外部所软件/硬件改变,告诉编译器不要去优化该条语句,每次执行时均从该地址中去读取这个值。再在(volatile unsigned char *)0x20的前面加上地址引用符号"*"则表示一个指针对应的变量,则这条语句就成为了一个可操作的指针所指向的地址内容,相当于*p,只不过这儿p的地址固定为了0x20,*p所指向的数据类型定义为了unsigned char,最后将define后面的内容用括号括起来,这是一个良好的编程习惯!最终就形成了我们所看到的 (*(volatile unsigned char *)0x20)形式。