请问宏定义 #define rSYSCFG (* (volatile unsigned *) 0x1c00000) 宏替换的过程是怎样的?

怎么就把它定义成了一个地址了?里面具体使用了多少次宏替换,有多少个指针?

宏替换:
程序中凡出现变量名字 rSYSCFG
用字符串 (* (volatile unsigned *) 0x1c00000) 替代 后 再编译。追问

这一点我知道,关键是怎么定义出一个地址为0x1c00000的指针的?

追答

(volatile unsigned *) 强制转换为 4 字节地址 指针。

追问

那么强制转换括号外面的 * 又怎么理解呢?0x1c00000只是一个指针名么?

追答

强制转换括号外面的 * 理解为 (void * )

追问

不好意思,可以再详细点么,那就是说这是一个二级指针,理解为一个指向任意类型的指针,该指针又继续指向一个无符号的可被多线程访问、修改的变量,那0x1c00000只是一个二级指针的名字咯?但是在程序中的目的它是要被用来当做一个0x1c00000地址的。

追答

需要放入替代后的句子里去理解。
(volatile unsigned *) 0x1c00000 强制转换为 4 字节地址
(*(volatile unsigned *)0x1c00000) 也可以代表一个变量的值,即 0x1c00000地址中的内容。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-01
rSYSCFG 被替换成 (* (volatile unsigned *) 0x1c00000)

一个 强制转换
0x1c00000变成指针,一个解引用*,把指针变成所指对象;
地址是一个整数,这里把整数当地址用,然后把这个整数强制转换为指针
(volatile unsigned *)类型,对这个指针,不能进行优化(这应该是一个寄存器吧!)

最后用* 获取指针引用的数据,可以给他赋值,也可以把这个值,赋给别的变量;
似乎DSP的C,C++,经常采取这种方式,定义寄存器。
第2个回答  2013-04-01
这里涉及一次类型转换和一次取地址操作,
volatile unsigned * 是强制将0x1c00000转换成一个无符号整数的指针(4 Bytes)

然后取这个地址的值
相似回答
大家正在搜