Int **pt; 一個指向指針的指針:
{ int ** pt; //一個指向指針的指針; int *ppt; int a = 2; ppt = &a; pt = &ppt; printf("*pt=%p\n", &*pt); printf("ppt=%p\n", &ppt); //*pt的地址就是ppt的地址 printf(" a=%p\n", &a); printf("*ppt=%p\n", &*ppt); printf("**pt=%p\n", &**pt); printf("**pt=%d\n", **pt); printf("*ppt=%d\n", *ppt); //*pt的地址是ppt的地址,而ppt指向的地址是a //所以*ppt的地址是 a, **pt的地址是也是a, //但是*pt的地址是ppt的地址; }
輸出:
*pt=000000000062FE40
ppt=000000000062FE40
a=000000000062FE3C
*ppt=000000000062FE3C
**pt=000000000062FE3C
**pt=2
*ppt=2*ppt=2
再轉一個別人的理解
指向指針的指針到底是什么
指針是一種抽象,在計算機中指地址編號,當然你可以把生活中的任何東西進行精心有用的抽象,一個指針在計算機中就相當於地址編號+其對這個地址編號的解釋方式。指針變量呢就是1個代號,通過這個代號可以取得指針的這么一個東西,為什么會有變量產生,主要是為了避免程序員直接和地址打交到而產生的變量。指針變量也是變量占內存的,所以指針變量就會它的地址,既然有地址,那么這個地址就可以給另外一個指針變量,那么另外的這個指針變量就叫做指向指針的指針。
變量的直接引用與間接引用
通過變量名叫做直接引用,通過指針對變量的引用叫間接引用
間接引用的兩種情況
1,如果在一個指針變量中存放的是一個目標變量的地址叫做一級地址
2,如果在一個指針變量中存放的是指向目標變量的地址的指針變量的地址,那么這個就叫做二級地址。
怎么來理解這2句話呢,就是可以這么比喻。你喜歡1個人,然后在電話本上找到它的號碼(指針)然后你就可以打電話去表白啦!這個就是叫一級地址。再如果,你喜歡1個人,但是你沒有他的電話號碼,但是你知道他妹妹的電話號碼,你就可以拿出電話本查詢找她妹妹的電話號碼(指針)然后通過她妹妹的電話本(指針)最終找到你喜歡的人!也就是說二級指針取內容便得到一級指針,一級指針再取內容就得到了目標變量啦!
注意一個程序指針要是超過了2級,你就該考慮下你的設計是否合理了。
指向指針的指針的例子:
{
int a =99;
int*pa =&a;
int**ppa =&a;
}
大家看這個程序正確嗎?細心的你一下子就反應過來,這樣是絕對不行的,因為類型不匹配呀!會報錯啦!
那么再看這個程序:
{
int a =99;
int*pa =&a;
int**ppa = &&a;
}
嘿嘿!這樣是不是就可以啦!其實啊!這樣寫也是錯誤的,因為變量取地址就是一個地址常量,地址常量是無法取地址的呢!我們的取地址符只能對有內存空間的東西啦!
所以正確的應該是這樣的:
{
int a =99;
int*pa =&a;
int**ppa =&pa;
}