關於指標傳遞和指標的指標

Auditore發表於2018-01-03

一開始沒有理解,導致對這個概念非常的模糊和不解。最近看完《 徹底搞定C語言指標詳解》,裡面關於指標的指標的解釋有了頓悟感。 其實,很好理解,是我把它想複雜了。 我們都知道,實參和形參的區別。形參並無法改變實參,這就是值傳遞。還有一種叫指標傳遞,實質就是去操作指標的指向物件。例子如下:

Exchg2(int *px, int *py)
{
int tmp=*px;
*px=*py;
*py=tmp;
print(“*px=%d,*py=%d\n”,*px,*py);
}
main()
{
int a=4;
int b=6;
Exchg2( &a,&b);
Print (“a=%d,b=%d\n”, a, b);
}
複製程式碼

這時候列印出來的結果是什麼呢? a=6,b=4 px = 6, py =4 為什麼? Exchg2這個函式的引數是兩個int型指標,是地址,所以你要用&取a和b的地址傳入。在Exchg2的函式內部,兩個指標所指向的值交換了,因為之前你已經把a和b的地址傳遞給了px和py這兩個指標,所以現在操作px和py指向的值,也會導致a和b所指向的值發生變化。

這個雖然饒了些,但還是勉強能理解。那麼,如果是指標的指標呢? 如下: 這個函式本意是為傳入的字串開闢空間,但是仔細看,它真的達到了這個效果嗎?

void GetMemory(char *p, int num)
{
 p = (char *)malloc(sizeof(char) * num);

}
main(int argc, _TCHAR* argv[])
{
 char *str = NULL;
 GetMeory(str, 100);
 strcpy(str,"Hello");
 cout << str << endl;
 return 0;
}

複製程式碼

顯然不能,為什麼?這其實和值傳遞是一個意思,你傳遞進來的是一個指標實參str,而函式的形參p去替換了實參,所以後面操作的都是形參而已,並不會對實參有影響。這就不符合我們要求了啊,那怎麼辦?上一個例子,我們傳入實參的地址,然後交換地址指向的值,來達到我們交換實參的目的,那麼在這邊我們也可以這麼幹啊。

void GetMeory(char **p, int num)
{
 *p = (char *)malloc(sizeof(char) * num);
 //*p = new char[num];  //C++當中
}
int _tmain(int argc, _TCHAR* argv[])
{
 char *str = NULL;
 GetMeory(&str, 100);
 strcpy(str,"Hello");
 cout << str << endl;
 return 0;
}
複製程式碼

這不就是把str的地址&str傳入了GetMeory函式內嘛,只不過這個str本身也是一個指標,管它呢,還有就是GetMeory中的引數變成了char **p,這也很好理解,我傳入的是指標的指標,如果你還是隻用指標char *p來接收的話,不就也只是操作形參了和值傳遞沒區別了啊。我要操作的是實參指標,所以形參必須是實參的指標,也就是char **, 好繞口,不過 不難理解,你想想為什麼值傳遞沒有改變實參就知道了。

最後我們改變的是p,也就是形參char **p的值,因為是取值符。指的是**p指向的值,也就是一個地址,是指標。和指標傳遞的那個例子不同,那個例子是為了交換兩者指向的值,所以要看你想實現什麼,來決定操作什麼值。

相關文章