2016-01-28 147 views
-5

當在C中聲明指針時,*(volatile unsigned char *)等效於剛剛使用volatile unsigned char?例如,將寫在C中聲明指針

#define myMemoryLocation (*(volatile unsigned char *)(12345678)) 

是相同的使用:

#define myMemoryLocation (volatile unsigned char)(12345678) 
+2

究竟是什麼'*(volatile unsigned char *)'? –

+0

'*(volatile unsigned char *)'與聲明指針有什麼關係? – immibis

+0

@ Sourav Ghosh。請參閱我的回答,詳細解釋'*(volatile unsigned char *)'是否爲 – George

回答

2
#define myMemoryLocation (*(volatile unsigned char *)(12345678)) 

作爲在地址相同

#define myMemoryLocation (volatile unsigned char)(12345678)) 

第一對待12345678記憶並評估任何存儲在那裏的值;第二個簡單地將整數值12345678轉換爲volatile unsigned char。你會得到兩個不同的結果。

3

讓我們一步

  • 開始時你有一個int分析你的第一個表現步驟:12345678

  • 演員(unsigned char *)(12345678)產生的指針。該指針指向一個內存地址12345678。如果你尊重這樣的指針,你會得到一個無符號的字符

  • (volatile unsigned char *)(12345678)是相同的指針,但是你告訴編譯器的內存位置的值,這個指針指向可以「自行改變」。

  • 然後,您取消引用指針,因此*(volatile unsigned char *)(12345678))是內存位置12345678的值解釋爲unsigned char。因爲它是volatile編譯器每次解引用指針時都必須發出代碼來讀取內存位置;例如,它不能在寄存器中緩存該位置。

  • 最後,你把這個表情符號名#define myMemoryLocation (*(volatile unsigned char *)(12345678))

所以每次你在程序中使用myMemoryLocation時,編譯器發出的代碼從存儲器中讀取地址爲unsigned char 12345678

現在,讓我們看看你的第二個表達。 (volatile unsigned char)(12345678))。這只是一個不變的表達。如果系統中的無符號字符長度爲一個字節,則其值始終爲0x4e(或十進制78)。

顯然這兩個表達式是非常不同的。

+0

謝謝您的好評!我最初的困惑在於添加* before(volatile unsigned char *)是否會導致整個表達式停止成爲指針。不幸的是,我已經在你的帖子之前接受了一個答案。 – user2875474

+0

非常歡迎。我們都在爲了學習,幫助和拓寬思路。另一個答案也是正確的,所以在接受它時沒有問題。 – George

+0

這是一個很好的答案。 – Michi