1. 程式人生 > >這樣子來理解C語言中指標的指標

這樣子來理解C語言中指標的指標

友情提示:閱讀本文前,請先參考我的之前的文章《從四個屬性的角度來理解C語言的指標也許會更好理解》,若已閱讀,請繼續往下看。

我從4個屬性的角度來總結了C語言中的指標概念。對於C語言的一個指標,比如int *p,4個屬性分別如下:

C語言指標p=(指標自己的值,與星號結合名,有用資料的值,有用資料的型別);

這4個屬性用來理解C語言中單個指標可以,那麼本篇再用這4個屬性來解釋C語言中的“指標的指標”。

C語言中指標的指標,好多教材一般給出的定義是“變數的地址的地址”,或者是“指標的地址”,這滿滿的都是套路啊,理解一個地址就很難了,還地址的地址,深怕我們暈的還不夠瓷實?好吧,先上一段程式碼,如下:

#include <stdio.h>
int main(void)
{
int a = 1; //定義一個普通的整型變數a,初始值是1
int *p = NULL; //定義一個C語言的指標變數p,初始值是NULL;
int **pp = NULL; ////定義一個C語言的指標的指標變數pp,初始值是NULL;
p = &a; //指標p的值是變數a的地址;
pp = &p; //指標的指標pp的值是變數p的值;
printf("整型變數a的值是%d, 整型變數a的地址是%x\n", a, &a); //輸出變數a的值和變數a的地址
printf("指標p的地址是%x, 指標p的值是%x, 整型變數(*p)的值是%d\n", &p, p, *p); //輸出變數p的地址,變數p的值,變數p指向的值
printf("指標的指標pp的值是%x, 整型變數(*pp)的值是%x\n", pp, *pp); //輸出變數pp的值,pp指向的值
return 0;
}

程式碼的含義已經在程式碼註釋中寫出來了。看上去有點暈啊,又是“地址”,又是“指標”的,還有“指標的指標”。。。。。。

再貼個執行的結果,如下:

對此結果做個解釋:

1.有一塊記憶體區域,它的名字叫“a”,它的地址是“22fee8”,裡面存了一個值“1”;

2.又有一塊記憶體區域,它的名字叫“p”,它的地址是“22fee4”,裡面存了一個值“22fee8”;

3.又又又有一塊記憶體區域,它的名字叫“pp”,裡面存了一個值“22fee4”;

好了,現在咱就用那4個屬性來分析下C語言指標p和指標的指標pp。先看下指標的指標pp。套用4個屬性:

C語言指標的指標pp=(指標自己的值,與星號結合名,有用資料的值,有用資料的型別)

將每個屬性具體化,在本文中就是:

C語言指標的指標pp=(22fee4,p,22fee8,int)

哈哈,有沒有看出什麼名堂出來?

第1個屬性值“22fee4”是指標的指標pp自己的值,一般沒什麼用處,所以不用去關心。從第2個屬性開始,也就是:p,22fee8,int,這些都是指標p的屬性啦,如下圖所示:


那麼:

C語言指標的指標pp=(22fee4,p,22fee8,int)可以寫為:

C語言指標的指標pp=(22fee4,指標p的第1個屬性,指標p的第1個屬性的值,指標p的第4個屬性);

也就是從第2個屬性開始,就可以拋棄指標的指標pp,不用去想這個pp了,請完全用指標p的思維來考慮問題。

好了,現在再從4個屬性來考慮指標p:

C語言指標的指標p=(指標自己的值,與星號結合名,有用資料的值,有用資料的型別);

再將每個屬性具體化,就是:

C語言指標的指標p=(22fee8,a,1,int);

哈哈,又看出啥名堂來了吧?

第一個屬性值“22fee8”是指標p自己的值,一般也沒什麼用處,所以也不用去關心。從第2個屬性開始,也就是:a,1,int就是變數a的屬性啦,如下圖所示:



那麼:

C語言指標的指標p=(22fee8,a,1,int)可以寫為:

C語言指標的指標p=(變數a的第1個屬性的值,變數a的第2個屬性,變數a的第3個屬性的值,變數a的第4個屬性);

也就是從第2個屬性開始,就可以拋棄指標p,不用去想這個p了,請完全用變數a的思維來考慮問題。

所以啊,指標的指標pp,指標p,變數a,三者的關係是pp的屬性包含著p的屬性,p的屬性包含著a的屬性,我們只需要像剝洋蔥那樣,一層一層地撥開,就會發現最終的變數a了。