c语言指针的指针
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指向這個地址,可以使用。!!!!
轉載于:https://www.cnblogs.com/ghost-98210/p/9495430.html
總結
- 上一篇: HBase解决海量图片存储方案
- 下一篇: [20180818]校内模拟赛