淺談指標 (轉)

worldblog發表於2007-08-14
淺談指標 (轉)[@more@]

此文僅適合初學C語言的朋友,凡是學了幾個月以上的不要對此文內容嗤之以鼻。:namespace prefix = o ns = "urn:schemas--com::office" />

C語言最具特色的是什麼?指標。這個答案好像是公論,無論高手還是低手,菜鳥還是老鳥,學過的還是沒學過的,但凡是聽說過C的,都能回答出來。正是因為C引入了指標的概念,使得他是最接近機器真實模型的高階語言,以至於得到了“中級語言”的稱號;象我這樣有時候比C用的還多的人體會的更深——微控制器,我只會彙編,雖然現在開始學C,還是覺得怪怪的。

因此,指標是學習C必須掌握的,如果你畏懼它,不如換一門沒有指標的語言。下面有個小例子,希望你能從中得到一些啟發。

#include

void main()

{

  int a = 10000;/*-------1*/

  int* p, d;/*--------------2*/

  p = &d;/*---------------3*/

  p = (int*)a;/*-----------4*/

  printf("%d %d", a, *p);

}

我來簡單講解一下:

是這樣寫int *p好還是這樣寫int* p好?

這兩種用法都是可以的,並且每種寫法都有擁護者。指標運算子是向右結合的,如果你象2語句那樣寫,實際上d還是int型別,而不是指標型別,贊成int *p寫法的,就是出於這個原因。你說我把int*用括號括起來不就行了,但是會把這樣的寫法當成是型別轉換,而不是型別定義。贊成int* p寫法的,原因就是直觀,很清晰的表示p是個整型的指標。例如這樣的寫法int* p = &a;換成int *p = &a;就很讓人費解。為了避免象2語句的誤解,有個規則就是,一行只定義一個指標。

具體怎樣寫,要看個人習慣,每種寫法人們都是認可的。

指標的危險性

指標實際上就是一個存有地址的變數,用指標訪問就相當於間接定址。很顯然,你可以給指標賦不同的數值,這樣就能訪問任意的記憶體——太危險了,例如4語句。在16位中,你對這種使用毫無辦法。幸運的是,在32位系統中,這種使用被禁止了。

指標的型別

你說指標不就是一個存有記憶體地址的變數嗎,既然都是“記憶體地址”型別,幹什麼還要型別啊。但是需要注意的是,當你從指標還原的時候,它指向的那塊記憶體,究竟是按照整型來用啊還是別的什麼結構?從這個角度來說,當你很清楚指標指向的記憶體的內容,做指標型別變換也是允許的。

關於指標,每本C語言書籍都有很詳細的介紹,我就不再多說了。當你粗淺的瞭解彙編的時候,相信你會對指標有更深刻的理解。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-956765/,如需轉載,請註明出處,否則將追究法律責任。

相關文章