先來段代碼
int a = 90;
int *p;
p = &a;
*p = 3;
int **p1 = &p;
printf("%p\n%p\n",p1,&p);
putchar('\n');
putchar('\n');
printf("%p\n%p\n%p",*p1,&a,p);
putchar('\n');
putchar('\n');
printf("%d\n%d\n%d",**p1,a,*p);
putchar('\n');
解釋 : 指針其實就是一個地址 上面的p其實也是一個在棧上面的變量,只不過它存儲的是其它數據的地址: &a == p,那么作為一個變量它也有自己的地址&p
p1 也是一個指針變量,只不過他是指向指針的指針, 說起來比較抽象,實際還是那個初學的時候我看到 和*的時候是迷茫的,但是只要不看或者是忽略它即可,它只是申明了自己是一個指針的類型:例如block有^,閉包有->,結構體有struct等 要不然我咋知道它是指針還是基本類型。 作為一個指針,它其實還是一個變量,它的內容是變量。
那么 p = &a 就是將a的地址賦予了變量p 那么p就是我們告訴編譯器我們需要根據&a也就是p的地址到相應的內存空間中 操作變量a的值,這里的P的和 intp是不一樣的前者表示的是一種操作后者僅僅是代表C的一種構造類型指針變量的標志除此以外它沒有卵用。
那么p作為一個變量它必須也得有自己的覺悟,它在棧上開辟存儲控件辣么它也有地址&p這里的&p和p是不一樣的 &p是p自己的地址 p是p所指向的存儲空間的地址&a。
那么變量p1 它作為一個變量肯定必須也有自己的地址嘿嘿&p1
那么 p1就是 &p 記住在看指針的時候 一定別看前面的號你會發現指針就清除多了嘿嘿。 你看看 p1是指針變量p的地址 那么它肯定和人家a沒啥關系了
p1 你想想啊 這里的我在前邊說了,它是告訴編譯器去操作對應的變量的存儲控件也就是p的值 那么p作為一個指針變量它就是用來存儲地址的嘛所以 p1其實就是 p 或者就是&a 你說是不是? 辣么問題來了 我們知道p1==p==&a,前面提到了 作為一個地址用符號可以操作地址對應的空間的值所以*p1就==p ==a拉 。
以上就是我對二級指針的一點看法,隨便寫的,寫錯拉倒。。。