2014-01-07 33 views
0

我對C相當陌生,正試圖用七段顯示器編寫一些基本應用程序。在聲明的絕對地址,一個8位端口,我可以寫的東西,如:在微芯片上聲明/處理輸出端口

typedef char *port8ptr; 
#define OUT_ADR 0x400 
#define OUT *((port8ptr) OUT_ADR) 

,然後簡單地設置可變出像

OUT = 0x80; 

獲得十六進制80到端口。但是,上面的代碼究竟意味着什麼?也就是說,爲什麼要定義一個指針(第一行),然後將該地址轉換爲指針(?!)的指針?它顯然有效,但我真的不喜歡使用我無法理解的例子中的代碼。

另一種方式他們做了類型轉換爲與線

((unsigned char *) 0x400) 

但我真的不明白,要麼。

非常感謝提前!這裏

阿克塞爾

回答

1

當你完成所有的預處理你得到這一行:

*((char*)0x400) = 0x80; 

讓我們來仔細研究這個。 (char *)0x400表示將數字0x400轉換爲「指向字符的指針」。基本上它在這裏說:讓我們創建一個指向地址0x400的指針。

然後,我們將其前面的*表示「取消引用」,這使得您實際上可以在指針指向的內存點中寫入內容,在這種情況下地址爲0x400。然後你在其中寫入0x80

+0

謝謝,我想我現在得到它!所以基本上,我們對「(port8ptr)OUT_ADR」這行的操作是將地址轉換爲指針,然後將它解引用,以便在表達式的前面用asterix實際上將某些東西寫入端口? – user2950764

+1

是的,就是這樣。 –

1

的困惑是第二行 - 你認爲這是一個轉換爲指針的指針,而它實際上是一個指針的強制的解引用。

讓我們回到基礎。保存您對這個角色

char c = 'A'; 
char *p = &c; 

你可以解引用p,得到回C字符和指針 - printf('%c', *p)將打印,並*p='B'將C'S內容更改爲B.

另一個基本的東西是將整數轉換爲指針 - ((char *)0x400)表示指向地址0x400處的字節的指針。

所以第二線實際上意味着「寫0x80到字節地址0x400」

+1

謝謝!但是,我可以簡單地寫「char * ptr; ptr = 0x400; * ptr = 0x80」。在我看來,這應該啓動一個指針,將「指針地址」設置爲0x400,然後將其解引用並將0x80寫入ptr指向的位置? – user2950764

+0

你是對的,你可以做到這一點。 – zmbq

1

語言B和C之間的大的差異,是下加入的類型。因此,您可以在某處指定地址,並且該類型會告訴編譯器是否需要爲該值加載一個,兩個,四個或更多字節。因此,雖然您可以指向系統中的任何地址,但您需要向編譯器提供有關要加載的位置處有多少個字節的附加信息。這些都會做不同的負載:

int x1= * (unsigned char *) 0x400 ; 
int x2= * (unsigned short *) 0x400 ; 
int x4= * (unsigned int *) 0x400 ; 

所以x1將會從0x400有一個字節的數據,而x4都將有四個字節。這就是爲什麼你告訴編譯器什麼地址,然後要求它在那裏查找值。

+0

謝謝!這種類型的ting是我必須檢查更多,特別是在使用指針算術時。 – user2950764