C語言指針的心得體會~

C語言學了這麼些天數,果然遇到的第一個難點就是指針~

指針學習就要結束了,先記錄並梳理一下來自己初步理解的內容:

在梳理指針之前;

首先要明白虛擬內存中,是存在連續的,線性排列的內存塊,每個內存地址代表一內存塊,每一內存塊佔用一字節。每個內存塊都擁有自己的地址,都可以存儲一字節即八位的二進制數據。

然後是有關指針的內容:

1,指針一般在內存中定義爲四個字節,和數據變量一樣,它也具有地址,和數據變量不同,他存放的只能爲其他變量的地址。

2,指針是也是一種數據類型,它不是單獨存在的類型,它是由其他類型派生而來的。(例如類型可以是:指向int的指針類型)

3,一般我們稱爲的指針具有的屬性爲三,一爲指針類型,二爲指針類型的名稱即變量,三爲指針的內容即指針地址。

舉例:int *p = #  那麼,int* 爲指針類型,p爲指針類型的變量,&num爲指針類型的值即一個內存地址。

4,一般我們把指針類型的值即指針存儲了地址稱之爲指向,譬如指針A指向變量a就是指針A存儲了變量a的地址。

5,指針類型的值僅僅是一段連續內存的首個地址,就是它只能存儲一個內存塊的地址。

6,數據一般由多個字節組成即佔用多個內存塊,而指針只能存儲一個內存塊的的地址,這導致我們解引用時只能讀取到一塊內存的數據,讀取char類型數據還好,可一旦讀取長字節數據,就會出現問題。爲了避免出現這種問題,就有了指針類型的出現,當我們定義指針類型爲int型時,這就導致指針解引用時在對應的內存塊依次讀取(四個內存塊)四個字節的內容。

7,指針類型的定義一定要看指針所指變量的數據類型,指針的類型一定要和所指變量的數據類型一致,原理如上一條。

8,指針p指向存放數據的變量,那麼p就是一級指針。若指針p指向另一指針變量,那麼它就是二級指針,若p指向指向指針的指針,那麼p就是三級指針,可以依次類推。

9,指針的賦值就是取得變量的地址,取址符&。指針可以直接取得數據變量的地址,那麼此此指針就是一級指針。

10,指針的賦值非常講究,編譯器只可將兩邊等級相同的指針着完成賦值。倘若我希望定義指針p爲三級指針來操控二級指針q所操控的數據,那麼我需要取得二級指針q的地址來賦值給p。所以在很多地方,尤其是存放字符串的指針數組這裏,想要輸出字符串一定要考量好了該定義幾級指針來存放指針數組的指針地址,因爲字符串指針爲一級,指針數組內的指針元素爲二級,指針數組的指針爲三級指針,你至少需要定義一個四級指針才能存放指針數組內嵌的指針的地址。

11,用指針輸出數據時,需要用到解引用,字符爲*,它的功能就是按地址尋此地址對應的變量並獲取變量存儲的內容,可以獲取數據,也可以獲取地址,當獲取了地址時,倘若爲print函數用f%d做輸出,是不能立即輸出的,需要再次解引用,知道拿到數據爲止,倘若輸出爲%s,是可以直接取出字符串地址給printf輸出的。

12,有一規律就是定義幾級指針,輸出時就解引用幾次。

13,數組具有內嵌的指針,可以用數組名來表示,這個內嵌指針的地址爲數組首元素地址,這個指針存放的數據爲數組首元素的地址。即對與這個內嵌指針來講,它的地址 = 它的數據 。

14,指針數組*p[5]爲長度爲5元素均爲指針的數組,數組名爲p,數組具有內嵌指針就是p,算上數組元素是指針,p爲二級指針。數組名p就是數組的指針,進行指針運算時每對p進行+1,就得到了數組下個元素的地址,p的步長爲1。

15,數組指針(*p)[5]爲指向長度爲5沒有名字的數組的指針,p是一個指針,是單獨的指針,它所指向的數組沒有名字,所以數組的內嵌指針不好表示,但是也是存在的,數組內嵌的指針就是一級指針。那麼指向這個數組的指針p同樣也就是二級指針,但對p運算時p的步長爲5,這是由於p爲單獨的,指向整個數組的地址有關,p每加一跨度都是整個數組。

16,前面說過,數組的內嵌的指針本身的地址等於數組首元素的地址,所以,當數組指針解引用的時候,根據地址尋到的就是數組內嵌指針存儲的地址,也是數組首元素的地址,不過這次對地址進行運算,一級指針的運算,跨度就不是整個數組的跨度了,而是1。

17,***p與*(*p)[5]爲同級指針(均爲三級),只是進行指針運算時解引用之後的指針步長不同。

以後遇到有關指針新的心得體會,可以回來修正或者增添。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章