二级指针问题

#include
int k=7;void f(int **s){ int *t=&k;*s=t;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);}为什么答案是7,7,7,3,7,7?#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);}答案是7,5,5,3,3,3?为什么两道题的后三个数不一样?一个是3,7,7,另一个是3,3,3,?

第一个程序是:
#include<iostream>
#include<stdio.h>
using namespace std;
int k=7;
void f(int **s)
{
int *t=&k;
*s=t;
printf("%d,%d,%d,",k,*t,**s);
}
int main()
{
int i=3,*p=&i,**r=&p;
f(r);
printf("%d,%d,%d\n",i,*p,**r);
}

对于这个程序你要看到在main()函数中的**r=&p语句,当**r作为f函数的实参传递给f函数时,要注意*s=t语句,这两条语句正是答案后边为3,7,7的原因,**r=&p是对p这个一级指针区地址,因此r这个二级指针所存放的是p的地址,而*r是间接引用p的值,而p的值是i的地址。对于*s=t这个语句是把t的值赋给了*s,我们知道s就是r这个二级指针,*s是*r,即p.所以这个语句的意思实际上是把t的值赋给了一级指针p,而t的值是k的地址,所以就相当于把k的地址传递给了指针p,现在指针p就不会指向i的地址了,而是指向k的地址。所以**r=*p=k=7;所以最终结果是3 7 7。
第二个程序是:

#include<iostream>
#include<stdio.h>
using namespace std;
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);
}
这个仍然是将r指针传递到f函数中,在f函数中s=&t;s对t指针取地址,所以*s就代表的是t指针,下一个语句是*s=&m;这个相当于是t指针对m取地址。所以**s=*t=m=3;而函数f的调用执行完了以后会自动销毁数据,不同函数之间互不影响,因此在main()函数中看printf("%d,%d,%d\n",i,*p,**r);语句,此时*p=&i,**r=&p,语句是不受f函数中的那些操作的影响的,所以说**r=*p=i=3.所以结果才是3 3 3。

大概就是这样,你肯定能看懂的。。
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-02-04
两个程序在开始执行f函数的时候,f的形参s都是指向变量p的,也就是*s==p,但是第一个f中直接*s=t;相当于p=t;即直接把p的指向改变,把它指向了k,所以最后输出的*p和**r都变了。而第二个f中,先s=&t;这样就改变了s的指向,现在*s就不再等于p了,后面的*s=&m;相当于t=&m,这样没有对p的指向造成影响,所以最后p还是指向原来的i。指针这东西有时候比较乱,建议你自己画个图帮助理解
相似回答
大家正在搜