簡體   English   中英

有人可以給我解釋一下Pointer的用法嗎?

[英]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位大。

讓我們將其分解為以下步驟:

  1. sw_addr是一個變量。 變量的值為X。
  2. 在內存中,地址X位於您要讀取到變量“ switchs”中的一些32位(4字節)值。
  3. *sw_addr表示“地址X上的值”,表示我們要讀入“開關”的值。
  4. 由於sw_addr的類型為void * ,因此我們無法編寫switches = *sw_addr; 因為編譯器不知道您要讀取的數據大小。 也許您只想讀取一個字節,也許是兩個字節,也許是四個?
  5. 強制轉換(uint32_t *)sw_addr告訴編譯器將sw_addr視為指向uint32_t的指針,這意味着指向無符號32位值的指針。
  6. 語句*((uint32_t *)sw_addr); (為清楚起見,我添加了另一對括號,但這沒關系)表示我們的(uint32_t *)sw_addr指針所指向的值,即地址X處的4字節無符號值。
  7. 進行適當的轉換后,我們可以編寫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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM