C語言指標說明

2021-06-29 14:25:33 字數 1870 閱讀 5286

今天在閱讀**時發現一下幾行

#define gpbcon      (*(volatile unsigned long *)0x56000010)

#define gpbdat (*(volatile unsigned long *)0x56000014)

#define gpfcon (*(volatile unsigned long *)0x56000050)

#define gpfdat (*(volatile unsigned long *)0x56000054)

#define gpgcon (*(volatile unsigned long *)0x56000060)

#define gpgdat (*(volatile unsigned long *)0x56000064)

volatile 型別是這樣的,其資料確實可能在未知的情況下發生變化。比如,硬體裝置的終端更改了它,現在硬體裝置往往也有自己的私有記憶體位址,比如視訊記憶體,他們一般是通過映象的方式,反映到一段特定的記憶體位址當中,這樣,在某些條件下,程式就可以直接訪問這些私有記憶體了。另外,比如共享的記憶體位址,多個程式都對它操作的時候。你的程式並不知道,這個記憶體何時被改變了。如果不加這個voliatile修飾,程式是利用catch當中的資料,那個可能是過時的了,加了 voliatile,就在需要用的時候,程式重新去那個位址去提取,保證是最新的。歸納起來如下:

1. volatile變數可變允許除了程式之外的比如硬體來修改他的內容

2. 訪問該資料任何時候都會直接訪問該位址處內容,即通過cache提高訪問速度的優化被取消

對於((volatile unsigned long *) 0xe0028000)為隨硬體需要定義的一種位址,前面加上「*」指標,為直接指向該位址,整個定義約定符號iopin代替,呼叫的時候直接對指向的位址暫存器寫內容既可。這實際上就是記憶體對映機制的方便性了。其中volatile關鍵字是嵌入式系統開發的乙個重要特點。上述表示式拆開來分析,首先(volatile unsigned long *) 0xe0028000的意思是把0xe0028000強制轉換成volatile unsigned long型別的指標,暫記為p,那麼就是#define a *p,即a為p指標指向位置的內容了。這裡就是通過記憶體定址訪問到暫存器a,可以讀/寫操作。

對於(volatile unsigned char *)0x20我們再分析一下,它是由兩部分組成:

1)(unsigned char *)0x20,0x20只是個值,前面加(unsigned char *)表示0x20是個位址,而且這個位址型別是unsigned char ,意思是說讀寫這個位址時,要寫進unsigned char 的值,讀出也是unsigned char 。

2)volatile,關鍵字volatile 確保本條指令不會因c 編譯器的優化而被省略,且要求每次直接讀值。例如用while((unsigned char *)0x20)時,有時系統可能不真正去讀0x20的值,而是用第一次讀出的值,如果這樣,那這個迴圈可能是個死迴圈。用了volatile 則要求每次都去讀0x20的實際值。

那麼(volatile unsigned char *)0x20是乙個固定的指標,是不可變的,不是變數。而char *u則是個指標變數。

再在前面加"*":*(volatile unsigned char *)0x20則變成了變數(普通的unsigned char變數,不是指標變數),如果#define i (*(volatile unsigned char *)0x20),那麼與unsigned char i是一樣了,只不過前面的i的位址是固定的。

那麼你的問題就可解答了,(*(volatile unsigned char *)0x20)可看作是乙個普通變數,這個變數有固定的位址,指向0x20。而0x20只是個常量,不是指標更不是變數。

this指標說明(c )

1.提出 c 中,同一類的物件都有各自的資料成員的儲存空間,但是系統不會為每個類的物件建立成員函式的副本。class tclass 若有tclass a,b a.print b print 但從成員函式voidtclass print 看,並不知道它正在哪個物件上操作。因此,c 中為成員函式提供了乙...

C語言 指標各種形式說明

指標的一些複雜說明 指向陣列 int a int ip int i 0 ip a 指標指向陣列的位址 ip a i 指標指向陣列中元素的位址 srand函式生成隨機數 srand unsigned time null srand函式是隨機數發生器的初始化函式。原型 void srand unsign...

c 函式指標說明

下面隨筆說明函式指標用法。定義形式 儲存型別 資料型別 函式指標名 含義 函式指標指向的是程式 儲存區 通過函式指標呼叫的函式 例如將函式的指標作為引數傳遞給乙個函式,使得在處理相似事件的時候可以靈活的使用不同的方法。呼叫者不關心誰是呼叫者 需知道存在乙個具有特定原型和限制條件的被呼叫函式。1 in...