c语言指针的指针
c語言在函數(shù)傳遞時(shí)常常使用如下的形式。 1 void get(int **p)
對(duì)于這個(gè)形式,我想過為什么不能夠使用 *p 作為形參呢。下面我們看一下代碼和執(zhí)行結(jié)果
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 }?
由這個(gè)結(jié)果可以看出一開始ptr初始化為NULL,后面經(jīng)過get()函數(shù)以后ptr的指針為00511448,包括后面的函數(shù)退
出以后ptr的值也是00511448 。但是下面指?jìng)魅胫羔樀慕Y(jié)果相比較,我們就可以發(fā)現(xiàn)問題了。
?
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 }?在上面的結(jié)果看出來,函數(shù)結(jié)束以后,ptr的值為00000000了,不再和上面的結(jié)果一樣。
?
?
從這里我們可以看出來問題了。傳入的是指針的值,值是可以改變的。所以在后面函數(shù)結(jié)束以后ptr的值就被改變
了。如果后面我們需要用到這個(gè)指針,那么得到的結(jié)果就是錯(cuò)誤的,是不可靠的 ;所以我們需要向函數(shù)中傳遞一
個(gè)地址,然后在函數(shù)結(jié)束后,內(nèi)部分配的地址就依然存在并且ptr指向這個(gè)地址,可以使用。!!!!
轉(zhuǎn)載于:https://www.cnblogs.com/ghost-98210/p/9495430.html
總結(jié)
- 上一篇: HBase解决海量图片存储方案
- 下一篇: [20180818]校内模拟赛