簡體   English   中英

帶有C的指針的指針數組?

[英]Pointer array of pointers with C?

我想要一個指針數組,並且想要在(數組的)指針指向的內存地址中設置字節值。

這項工作會:

unsigned int *pointer[4] = {(unsigned int *) 0xFF200020, (unsigned int *) 0xFF20001C, (unsigned int *) 0xFF200018, (unsigned int *) 0xFF200014};
*pointer[0] = 0b0111111; // the value is correct for the address

還是語法有所不同?

編輯:我正在為SOC板編碼,這些是包含某些UI元素大小寫的內存地址。

unsigned int *element1 = (unsigned int *) 0xFF200020;
*element1 = 0b0111111;

起作用,所以我只是對此的C語法感興趣。

EDIT2:... = 0b0 ...中有0個太多

當然,只要您可以在自己的網段中找到地址,就可以了。

在運行此代碼時,很可能會出現分段錯誤,因為0xFF200020幾乎沒有機會進入程序段。

這不會引發任何錯誤並且可以正常工作,但是硬編碼指針指向的內存地址不是一個好主意。 取消引用某些未知/不存在的內存位置會導致分段錯誤,但是如果您確定內存位置和對它們的硬編碼值(如此處所做的那樣)是完全可以的。

簡短答案:

您寫的一切都很好。

思考:

  • 我非常喜歡使用stdint.h的類型。 這樣您就可以編寫uint32_t ,它顯然是32位無符號數字而不是unsigned long

  • 您會經常看到人們編寫宏來引用這些寄存器:

     #define REG_IRQ (*(volatile uint32_t *)(0xFF200020)) REG_IRQ = 0x42; 
  • 您實際上可能希望這些指針指向volatile整數。 如果值可以在程序執行之外更改,則希望它是易失的。 就是說,如果那個記憶位置並不嚴格地像一塊記憶。 (例如,它是一個存儲中斷標志的寄存器)。

    對於我在嵌入式平台上使用過的大多數編譯器,一旦啟用優化,就會遇到忽略volatile問題。

  • 0b00111111是, 0b00111111是非標准的。 您可以使用八進制,十進制或十六進制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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