當在C中聲明指針時,*(volatile unsigned char *)等效於剛剛使用volatile unsigned char?例如,將寫在C中聲明指針
#define myMemoryLocation (*(volatile unsigned char *)(12345678))
是相同的使用:
#define myMemoryLocation (volatile unsigned char)(12345678)
當在C中聲明指針時,*(volatile unsigned char *)等效於剛剛使用volatile unsigned char?例如,將寫在C中聲明指針
#define myMemoryLocation (*(volatile unsigned char *)(12345678))
是相同的使用:
#define myMemoryLocation (volatile unsigned char)(12345678)
#define myMemoryLocation (*(volatile unsigned char *)(12345678))
是不作爲在地址相同
#define myMemoryLocation (volatile unsigned char)(12345678))
第一對待12345678
記憶並評估任何存儲在那裏的值;第二個簡單地將整數值12345678
轉換爲volatile unsigned char
。你會得到兩個不同的結果。
讓我們一步
開始時你有一個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)。
顯然這兩個表達式是非常不同的。
謝謝您的好評!我最初的困惑在於添加* before(volatile unsigned char *)是否會導致整個表達式停止成爲指針。不幸的是,我已經在你的帖子之前接受了一個答案。 – user2875474
非常歡迎。我們都在爲了學習,幫助和拓寬思路。另一個答案也是正確的,所以在接受它時沒有問題。 – George
這是一個很好的答案。 – Michi
究竟是什麼'*(volatile unsigned char *)'? –
'*(volatile unsigned char *)'與聲明指針有什麼關係? – immibis
@ Sourav Ghosh。請參閱我的回答,詳細解釋'*(volatile unsigned char *)'是否爲 – George