0
我有一个在嵌入代码遇到如下定义:双星在指针定义
#define REG_ADD 0x20081004
#define pREG ((void * volatile *)REG_ADD)
为什么有2 *
在pREG
定义是什么?这是什么意思?
我有一个在嵌入代码遇到如下定义:双星在指针定义
#define REG_ADD 0x20081004
#define pREG ((void * volatile *)REG_ADD)
为什么有2 *
在pREG
定义是什么?这是什么意思?
void**
是指向无效指针。
void * volatile *
是一个指向volatile-qualified-pointer-to-void的指针。 (请从右向左阅读声明,See this。)
这是什么意思,简单的英语是pREG
很可能是某种硬件索引寄存器,其中又包含一个地址的指针。为了告诉编译器该索引寄存器可以随时更新,寄存器本身应该被视为volatile
。
一个稍微更可读的方式写同是:
typedef void* volatile reg_add_t;
reg_add_t* pREG = (reg_add_t)0x20081004u;
请注意,这个目的而使用的void*
是值得商榷的。该寄存器将有一个明确的用途,可能它应该是uint32_t * volatile
或uint8_t * volatile
。
指针指针。 –
这是正确的语法,但它看起来仍然是一个糟糕的主意。你能提供上下文吗? – Olaf
@ dandi-kain:在REG_ADD上做一个printf(),它的地址,然后是printf()pREG,DE-refferenced pREG和pREG的地址,这应该会帮助你看看发生了什么...... –