指針是C語言的靈魂,我想對於一級指針大家應該都很熟悉,也經常用到:比如說對於字元串的處理,函數參數的“值,結果傳遞”等,對於二級指針或者多級指針,我想理解起來也是比較容易的,比如二級指針就是指向指針的指針.....n級指針就是....但是可能大家比較不容易理解的是,二級指針或者多級指針用在哪裡呢?怎...
指針是C語言的靈魂,我想對於一級指針大家應該都很熟悉,也經常用到:比如說對於字元串的處理,函數參數的“值,結果傳遞”等,對於二級指針或者多級指針,我想理解起來也是比較容易的,比如二級指針就是指向指針的指針.....n級指針就是....
但是可能大家比較不容易理解的是,二級指針或者多級指針用在哪裡呢?怎麼使用呢?有沒有必要用呢?
現在我就談談C指針的比較經常用到的地方:
我們都知道C語言中函數傳遞參數都是傳遞"值"的,如下:
void fun(void)
{
int tmp = 0;
change(tmp);
printf("################ tmp = %d /n");
return ;
}
void change(int tmp_t)
{
tmp_t =1;
return;
}
這個時候fun()中列印出來的tmp值還是0,因為我們傳遞的是“值”,如果你想在函數change()中修改這個tmp的值能在fun()中生效的話,那麼就需要用指針來傳遞瞭如下:
void fun(void)
{
int tmp = 0;
change(&tmp);
printf("################ tmp = %d /n");
return ;
}
void change(int *tmp_t)
{
*tmp_t =1;
return;
}
這個時候fun()中列印出來的tmp值就是1了,因為我們此時傳進來的是tmp的地址,所以我們在change()中tmp_t就是tmp的地址了,而對於*tmp_t的操作其實就是對tmp的操作了。
到這裡的時候我們可以試想一下,我們通過傳遞指針來達到修改一個值的目的,那麼當你需要修改一個指針的時候呢,這個時候我們就需要指針的指針了,如下:
int fun(void)
{
int *buf ;
int ret ;
ret = mem_init(&buf);
return ret;
}
int mem_init(int **buf_t)
{
*buf_t = malloc(100);
return 1;
}
通過上面我們可以發現,fun()函數通過調用men_init()函數來實現給buf分配記憶體空間的目的。首先buf是我們定義的一個指針,&buf則是指向buf的指針(二級指針),我們通過把&buf傳遞個men_init()函數,那麼此時二級指針buf_t=&buf了,所以說buf_t是指向buf的指針,那麼對於*buf_t的操作其實就是對buf的操作了,這樣fun()就可以通過men_init()來分配記憶體了。
(補充一點:對於定義的int **buf_t中,二級指針buf_t=&buf,指向為buf(還是一個指針),一級指針*buf_t=buf,指向為*buf,
值**buf_t= *buf)
對於n級指針的使用也是差不多這樣了