2017-04-19 55 views
0

我有一個在嵌入代碼遇到如下定義:雙星在指針定義

#define REG_ADD 0x20081004 
#define pREG ((void * volatile *)REG_ADD) 

爲什麼有2 *pREG定義是什麼?這是什麼意思?

+1

指針指針。 –

+0

這是正確的語法,但它看起來仍然是一個糟糕的主意。你能提供上下文嗎? – Olaf

+0

@ dandi-kain:在REG_ADD上做一個printf(),它的地址,然後是printf()pREG,DE-refferenced pREG和pREG的地址,這應該會幫助你看看發生了什麼...... –

回答

5

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 * volatileuint8_t * volatile