[英]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.