[英]Can someone please explain me this Pointer usage?
我正在學習如何在Linux下為ARM A9編碼。 現在,我訪問一些外圍設備,例如LED。 我的代碼實際上正在工作,但是部分基於教程。 我唯一不了解的部分是:
void *virtual_base;
void *led_addr;
void *sw_addr;
int fd;
int switches;
switches=*(uint32_t *)sw_addr;
`
我不明白的部分是為什么我必須寫*(uint32_t *)sw_addr;
*sw_addr
表示它是一個變量,它指向一個特定的地址。在我的情況下,它指向特定的外設寄存器,從該地址讀取將讀取板上的開關狀態。 但是呢
*(uint32_t *)sw_addr
是什么意思? 您如何解釋它? 為什么我不能寫switches= sw_addr
?
如您所見,我有點困惑。
sw_addr是一個void
指針。 不能取消引用void
指針,因為void是非類型類型,即不存在void a;
作為變量聲明。 因此,在取消引用之前,將指針uint32_t*
轉換為uint32_t*
。 取消引用時,sw_addr地址處的值現在解釋為`uint32_t。
編輯:我應該提到您代碼中的特定操作可能並不安全,因為您將結果分配給一個int(已簽名,而uint32_t
的u代表未簽名)。 一個int
可能無法表示存儲在uint32_t
的數字,首先是因為unsigned int
可以存儲更大的數字,但也可能是因為未保證int
可以保證32位大。
讓我們將其分解為以下步驟:
sw_addr
是一個變量。 變量的值為X。 *sw_addr
表示“地址X上的值”,表示我們要讀入“開關”的值。 sw_addr
的類型為void *
,因此我們無法編寫switches = *sw_addr;
因為編譯器不知道您要讀取的數據大小。 也許您只想讀取一個字節,也許是兩個字節,也許是四個? (uint32_t *)sw_addr
告訴編譯器將sw_addr
視為指向uint32_t
的指針,這意味着指向無符號32位值的指針。 *((uint32_t *)sw_addr);
(為清楚起見,我添加了另一對括號,但這沒關系)表示我們的(uint32_t *)sw_addr
指針所指向的值,即地址X處的4字節無符號值。 switches=*(uint32_t *)sw_addr;
很明顯,我們打算從地址X讀取4個字節到switches
。 或者,我們可以編寫以下內容:
uint32_t *sw_addr;
int switches;
switches=*sw_addr;
“傻瓜”答案:
*(uint32_t *)sw_addr means?
這意味着,請給我uint32_t
來自sw_addr
指向的數據(32位)。
How do you interpret it?
void *sw_addr
指向未知大小的東西,它是一個void pointer
。 將其uint32_t
轉換為uint32_t
指針可以告訴我們它指向一個32bit unsigned integer
。 然后,當我們需要數據時,我們得到32 bits
(假設所有強制類型轉換都是正確的並且可以進行)。
Why I just cant write switches= sw_addr?
假設您的意思是switches = *sw_addr
,那是因為這就像說:從指針sw_addr
給我未知數量的數據(我們也不知道其指向的類型)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.