#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指向的地址没变)。基本上你只要能弄清指针指向的地址和指针本身的地址的区别这个问题就不难理解了(希望我没有把你绕晕)
f(r)里s=&t;这一句是将s指向t,然后后面的*s=&m;是改变了t的值,所以这个函数对i,p,r都没做更改。
“除非你打印*s它才是5.” 少了个“*” 应该是“**s它才是5”.
先看看你的f函数 我们暂且都抛开指针 把他们都看作变量好了
t = &k;t 存的是k的地址
s = &t; s存的是t的地址
s = &m; *s存的是m的地址。这一步的意思是 地址存在s里面的那个变量 存的是m的地址;相当于t存的是m的地址。
printf("%d,%d,%d,",k,*t,*s); 打印变量 k = 7; 由于第三步把m的地址存在了t里面 所以*t = 5; 最后*s 是t变量的地址,
它是一个不确定值,除非你打印*s它才是5.
在看你的main 函数
你调用f函数 传的是 p的地址
在f函数里 最初 s里面存的是 p的地址
然而在在地三部,你做了修改把m的地址存了进来,所以这一步就和外面断开了,打印完全跟外面无关了
最终main的打印 i= 3; *p = 3; **r = 3;
so。。。