指针定义中的双星

dou*_*leE -1 c embedded firmware

我在嵌入式代码中遇到了以下定义:

#define REG_ADD 0x20081004
#define pREG ((void * volatile *)REG_ADD)
Run Code Online (Sandbox Code Playgroud)

为什么有2个*pREG定义?这是什么意思?

Lun*_*din 5

void** 是指向void的指针.

void * volatile *是指向volatile-qualified-pointer-to-void的指针.(从右到左阅读声明,非常多.看到这个.)

这意味着简单的英语pREG可能是指向某种硬件索引寄存器的指针,而该寄存器又包含一个地址.为了告诉编译器这个索引寄存器可以随时更新,寄存器本身应该被视为volatile.

一种更易读的方式可以写出:

typedef void* volatile reg_add_t;
reg_add_t* pREG = (reg_add_t)0x20081004u;
Run Code Online (Sandbox Code Playgroud)

请注意,void*为此目的使用是值得怀疑的.该寄存器将具有已定义的用途,可能应该是a uint32_t * volatileuint8_t * volatile替代.