1. 程式人生 > >c語言指針的指針

c語言指針的指針

all .com color ptr 圖片 style alt 指針 malloc


c語言在函數傳遞時常常使用如下的形式。
1 void get(int **p)

對於這個形式,我想過為什麽不能夠使用 *p 作為形參呢。下面我們看一下代碼和執行結果

 1 void get(int **p)
 2 {
 3     printf("%p\n",*p);
 4     *p = (int *)malloc(sizeof(int) * 5);
 5     printf("%p\n",*p);
 6 }
 7 
 8 int main()
 9 {
10     int *ptr = NULL;
11     printf("%p\n",ptr);
12     get(&ptr);
13 printf("%p\n",ptr); 14 return 0; 15 }

技術分享圖片

由這個結果可以看出一開始ptr初始化為NULL,後面經過get()函數以後ptr的指針為00511448,包括後面的函數退

出以後ptr的值也是00511448 。但是下面指傳入指針的結果相比較,我們就可以發現問題了。

 1 void get(int *p)
 2 {
 3     printf("%p\n",p);
 4     p = (int *)malloc(sizeof(int) * 5);
 5     printf("%p\n",p);
 6 }
 7 
 8 int main()
9 { 10 int *ptr = NULL; 11 printf("%p\n",ptr); 12 get(ptr); 13 printf("%p\n",ptr); 14 return 0; 15 }

技術分享圖片

在上面的結果看出來,函數結束以後,ptr的值為00000000了,不再和上面的結果一樣。


從這裏我們可以看出來問題了。傳入的是指針的值,值是可以改變的。所以在後面函數結束以後ptr的值就被改變

了。如果後面我們需要用到這個指針,那麽得到的結果就是錯誤的,是不可靠的 ;所以我們需要向函數中傳遞一

個地址,然後在函數結束後,內部分配的地址就依然存在並且ptr指向這個地址,可以使用。!!!!

c語言指針的指針