學c語言初期,相信大家都會被指標所困擾,不知道怎麼去理解指標,本人在經過深入學習指標後終於理解單指標和雙指標的相關知識,現整理給大家,同時也是給自己學筆記,以免後面忘記了。
先從單指標說起:
首先我們先糾正一下,我前面一直說「指標」,這樣不容易理解,我建議大家包括我自己,下次多在「指標」後面加上「型別」,這樣叫:「指標型別」、「指標型別」、「指標型別」。
說白了它就是乙個型別,int char float 等也是型別,不過他們是資料型別罷了,那為什麼要多出這個指標型別?因為這個型別的變數它存的是記憶體位址,我們知道記憶體是由乙個個空間組成的,每個空間都有乙個位址。而這個位址我們就認為它不是資料型別,而是屬於指標型別,(我個人覺得這個指標型別也描述得不夠恰當,把它想象成「記憶體位址型別」吧)。只有指標型別才能儲存位址(因為我不是什麼專家,這樣說可能是錯誤的,但是對於新手來說,這是最容易理解的);
文字太多上點**:
int i = 5; int j = 6;
int *p = &i;
注意右邊的&i 表示取i 位址的意思,左邊定義了乙個指標型別p ,int : 跟 i 的資料型別一樣,* : 這是指標型別的 關鍵符號,就和 "int" 符號一樣,它只是乙個宣告的符號、宣告的符號,為什麼用* 、和 int 、float 這些符號? 這個你得去問c語言發明者。那麼這時 我們就定義好了 指標型別變數 p,同時這個p的 值是 i 的位址。
此時我們列印 p、和 *p,他們分別是 :
p: x0fffff... 具體是什麼不是我們關注的,我們關注的是它是乙個記憶體位址。
*p: 5.
好關鍵的地方到了,很多人都不理解為什麼*p 不是等於 記憶體位址。我上面說了 int *p 這是表示 定義乙個變數它是int型和指標型別的變數。就像 int const p 這樣只是定義p變數它是int型常量型別的而已,僅此而已,它的目的是宣告p。
後面的*p 為什麼等於5,此時變數p的值是變數i的乙個記憶體位址,如果要取i的值怎麼辦?那麼在p 前面 加* 表示取該變數p儲存的位址所指向的值。注意一點,在定義變數p的時候* 表示變數的型別,到後面在指標變數p 前加* 就是表示取值。兩種不同的意思。如果這樣還不理解,就多看兩遍。
下面說下雙指標:
int i = 5; int j = 10;
int *p1 = &i; int *p2 = &j;
int **pp = &p1;
上面的** p1 的值 是 i 的位址,p2的值 是 j 的位址,這個單指標的知識。
那麼這裡 int **pp = &p1;我們為什麼不用 int *pp = &p1;來取p1的位址呢?因為這是不允許的,c語言規定,定義乙個用來儲存普通變數記憶體位址的指標變數需要用單指標變數 即 *表示,定義乙個用來儲存 指標變數的記憶體位址需要用雙指標型別定義即 **,他們的區別是儲存的這個位址是普通變數的位址,還是指標型別變數的位址,如果是指標型別變數的位址就需要用** 來定義。如果你把上面的int *p1 = &i;變成 int **p1 = &i;那麼這是編譯不過的報錯的,同時如果你把 int **pp = &p1;變成 int *pp = &p1;那麼這也是編譯不過的報錯的。
那麼**pp、*pp、pp的值分別是啥:
先從 pp說起:我們說過,變數pp前面的一大串東西他們的作用只是宣告,兩個* 是因為語法要求。所以pp的值就是指標型別變數p1的記憶體位址;
那麼*pp 就表示取pp儲存位址的值,而pp指標型別變數的值是p1記憶體位址,取這個位址的值也就是相當於*p1的值 &i 最終值是 i的記憶體位址。
最後**pp,因為*pp的值是i 的記憶體位址,所以多乙個* 表示取i記憶體位址的值,也就是5;
為什麼我先從pp說起而不是從**p 說起呢?因為我們很容易被int **pp 這個宣告影響,記住pp只是乙個變數,前面的一串東西都是宣告它的,並沒有其他的含意,所以從pp變數開始推算才是正確的。
下面弄點難的:
在上面的基礎上我們多加一下**:
*pp = p2;
那麼此時的**p、*pp、pp 的值又是什麼?
首先不管怎麼樣,我們都必須從右往左推算。首先pp 這個指標變數並沒有變,所以它的值還是p1 的記憶體位址。
然後*pp 變了,那麼*pp 在之前的值是取p1記憶體位址的值,*p1 對吧?即i 的位址,現在它變成了 *pp = p2,那麼它的值即是 j 的記憶體位址。
那麼我們知道了*pp 的值是j 的記憶體位址,所以在*pp前面多加乙個* 就是取*pp位址所指向的值,就是j 記憶體位址的值,那就是變數j 10。
不理解多看幾遍。要下班了88
C語言雙指標
雙指標又叫二重指標,常常用於解決在不開闢額外記憶體空間的情況下交換陣列或字串中元素的相對位置的問題。這些是我目前為止遇到的雙指標用法 1.可以用來原地修改字串。兩個指標的運動方向相反 編寫乙個函式,其作用是將輸入的字串反轉過來。輸入字串以字元陣列 char 的形式給出。輸入 h e l l o 輸出...
c語言指標 指標和指標變數
指標是c語言中乙個重要的概念,也是c語言的重要角色。可以說指標是c的精華所在,學習指標雖然不易,但是只要肯花上時間去反覆的理解和實踐,就一定可以很好的掌握它。一 指標是什麼 指標到底是什麼?我們先舉乙個例子。假設我們在火車站 附近開了一家賓館,這家賓館有三千多間屋子,為了方便管理,我們給每個房間都加...
C語言 指標陣列和指向指標的指標
指標陣列的概念 乙個陣列的元素值為指標則是指標陣列。指標陣列是一組有序的指標的集合。指標數 組的所有元素都必須是具有相同儲存型別和指向相同資料型別的指標變數。指標陣列說明的一般形式為 型別說明符 陣列名 陣列長度 其中型別說明符為指標值所指向的變數的型別 指標陣列型別表示的是多個指標 一組有序指標 ...