C中雙重指標的使用的易錯點
阿新 • • 發佈:2019-01-08
寫blog之前,看了很多CSDN的文章,都表示堅持寫blog對一個程式設計師來說是很好的習慣,我以前也覺得寫blog也只是浪費時間和精力,覺得自己弄懂了就好,然而事實上過一段時間後碰到相同的問題卻還是需要時間去回憶和查詢記錄,這也就讓我產生了開始寫blog的想法。這是我的第一篇blog,的寫的不好之處請大家見諒。
言歸正傳,在c的使用中能用到雙重指標的地方不多,其中一個地方就是函式傳指標卻沒有改變指標的值。例如
void fun(char * pa)
{
printf("pa的地址:%d\n",pa);
puts(pa);
char *pb = "bb";
printf ("pb的地址:%d\n",pb);
puts(pb);
pa=pb; //在這裡發生了改變
printf("pa的地址:%d\n",pa);
puts(pa);
}
int main(void)
{
char *p ="aa" ;
printf("p的地址:%d\n",p);
printf("改變前p = ");
puts(p);
printf("------------------\n");
fun(p);
printf("------------------\n");
printf("p的地址:%d\n" ,p);
printf("改變後p = ");
puts(p);
return 0;
}
然而在fun函式中可以看到pa的地址發生了改變,但是p的地址卻沒有變化,這是因為在fun函式呼叫時,編譯器的處理就是pa=p,在fun函式中“pa=pb”卻將pb的地址賦給了pa,在這就造成了pa的指向發生了改變,而不再指向p。
如果要在fun函式中改變p的值就需要用到雙重指標的,只需要稍微的修改程式碼就可以達到在fun函式中改變p的值
void fun(char ** pa)
{
printf("pa的地址:%d\n",*pa);
puts(*pa);
char *pb = "bb";
printf("pb的地址:%d\n",pb);
puts(pb);
*pa=pb; //這裡pa是雙重指標 pb是一重指標
printf("pa的地址:%d\n",*pa);
puts(*pa);
}
int main(void)
{
char *p ="aa" ;
printf("p的地址:%d\n",p);
printf("改變前p = ");
puts(p);
printf("------------------\n");
fun(&p);
printf("------------------\n");
printf("p的地址:%d\n",p);
printf("改變後p = ");
puts(p);
return 0;
}
如圖,這樣就在函式中改變了p的值
就是在記憶體中&p最終指向了pb
而之前卻只是用pb的地址覆蓋了p的地址。
類似的用法還用在了c實現連結串列中頭結點的使用。
第一次寫blog,難免有些不足,歡迎大家指正。謝謝了