最近看stm32**,有這樣一段話不理解
#define gpioa ((gpio_typedef *) gpioa_base)
然後我就思考了下,不就是定義乙個巨集,然後宣告乙個結構體變數,進行賦值麼?
然後我隨便定義了乙個位址,強制轉換成乙個結構體指標型別,**如下:
typedef struct
student;
#define a ((student *) 0x12345678)
int main(int argc, char ar**)
執行時,程式直接崩潰。然後查閱經典資料,《c和指標》
劃線部分大致意思,在乙個未知的位址,強行賦值,可能會改變程式本身某一部分的記憶體段,導致崩潰。
隨後,我隨便定義了乙個結構體型別的變數,然後讀出其記憶體位址。可以執行。**如下:
typedef struct
student;
define a ((student *) 0x12345678)
int main(int argc, char ar**)
其中,0x12ff40是我定義test後,取得到的記憶體位址。這樣a指標就有了實際意義。
再反過來看stm32的io定義
#define gpioa ((gpio_typedef *) gpioa_base)
再引用經典《c和指標》,gpioa,並不是用於訪問某個變數,而是訪問硬體本身。
這就意味著,如果使用gpioa中的內容,那麼就相當於改io配置。換句話說,通過記憶體,建立起了io與程式設計師的互動通道。
用C語言給指定的記憶體位址賦值(通過指標)
這兩天找工作,做面試題的時候,碰到這樣的題 指定了乙個位址,比如說0x0012ff7c這樣乙個位址,要求是給這個指定的位址賦乙個確定的值,比如說100,當時就是乙個鬱悶啊,在彙編裡這樣用過,在c中還真沒用過。今天在網上查了查,自己也在turbo c上執行了一下,正好做個總結,方法如下 char te...
C語言記憶體位址
任務清單 c語言在記憶體中一共分為5個區域 記憶體棧區 存放區域性變數名 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等,函式呼叫結束後釋放記憶體空間。通常是用於那些在編譯期間就能確定儲存大小的變數的儲存區,用於在函式作用域內建立,在離開作用域後自動銷毀的變數的儲存區。通常是區域性變數,函...
C語言記憶體位址基礎(ZZ)
從計算機記憶體的角度思考c語言中的一切東東,是挺有幫助的。我們可以把計算機記憶體想象成乙個位元組陣列,記憶體中每乙個位址表示 1 位元組。比方說我們的電腦有 4k 記憶體,那這個記憶體陣列將會有 4096 個元素。當我們談論乙個儲存位址的指標時,就當相於我們在談論乙個儲存著該記憶體陣列某個元素索引的...