#include
int k=7,m=5
void f(int **s)
{ int t=&k; _
_s=&t; _
_*s=&m; _
_printf("%d,%d,%d,",k,*t,*s);}
main()
{ int i=3,*p=&i,**r=&p;
f(r);
printf("%d,%d,%d\n",i,*p,**r);}
/*VC++程序運行結果:7,5,5,3,3,3*/
求解C程序問題,f(r)後第二個printf結果為何是3,3,3呢?r的地址調用函數f後不是改變了嗎?應該為5吧?p的地址也應該改變了吧?
這個問題的關鍵在於函數f(int** s)並沒有修改s的地址,只是修改了s的值。你可以先把s看成一個普通變量,向函數中傳入一個普通變量會對這個普通變量的值產生影響嗎?事實上,除非你傳了這個變量的指針進去,否則不會對這個變量的值造成這個影響。
如果還是不明白,可以看下下面這段代碼:
#include
void f(int* p)
{
int i = 9;
p = &i;
}
int main()
{
int i = 10;
int *p = &i;
f(p);
printf("%d\n",*p)
getchar();
return 0;
}
打印出來的結果是10,因為p雖然作為指針傳進去了,但是在函數中只是對p的值進行了修改,p的地址並沒有變(p本身的地址沒變,而不是p指向的地址沒變)。基本上你只要能弄清指針指向的地址和指針本身的地址的區別這個問題就不難理解了(希望我沒有把你繞暈)