其实很简单 所谓的址传递还是值传递 只不过传递的是地址的值罢了
也就是说传递指针就是相当于传递 int。(32位)
你在函数里修改值传递过来的int当然不影响外面的东西了。
想要影响必须解引用(*)也就是说修改这个int保存的地址里的内容。
不信你试试void p(int a){//传递一个int
*(int*)a=1;
}
mian()
{
int b=5;
pp((int)&b); //传递一个int里面保存b的地址
printf("%d",b);
}
你那题目第一个函数修改的是 值传递进去的p和 q内的地址保存的内容。
因为是值传递所以main里的r不会改变什么 因为n的地址保存的内容被改变了所以n被改变了。
第二题也差不多修改的都是值传递进去的内容。所以不会改变。
看看这个相信你对指针和参数传递的理解会加深一点点。
第一题
void f(int *p,int *q)
{ p=p+1;*q=*q+1;}
注意是p=p+1,不是*p=*p+1
所以不会改变*p的值,故不变。
对于第一题f(r,&n)之后p=p+1。所以没有了实际值...而对于*p的值是n,而*p+1就是n+1成立了...因此输出1.3;
对于第二题void fun其实只是交换了指针的指向对于p.q都没有影响,所以只是在输出初值,输出了3.5.3.5
#include
void f(int *p,int *q)
main()
{ int m=1,n=2,*r=&m;
f(r,&n); printf("%d,%d",m,n);
}
void f(int *p,int *q)
{ p=p+1;//这里是地址加1,不会改变所指单元的值,就是说永远不会改变实参的值
*q=*q+1;}
#include
void fun(int *a,int *b)
{ int *c;
c=a;a=b;b=c;//这儿是交换地址,永远不会改变实参的值
}
main()
{ int x=3,y=5,*p=&x,*q=&y;
fun(p,q); printf("%d,%d",*p,*q);
fun(&x,&y); printf("%d,%d",*p,*q);
}