马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
我想将main函数中的a=1通过指针形式改成a=2
方法一#include<stdio.h>
void f(int **);
void f(int **ptr)
{
int b = 2;
*ptr = &b;
}
int main()
{
int a = 1;
int *p;
p = &a;
printf("*p= %d, p= %p\n", *p, p);
f(&p);
printf("*p= %d, p= %p\n", *p, p);
return 0;
}
方法二#include<stdio.h>
void f(int *);
void f(int *p)
{
int b = 2;
p = &b;
}
int main()
{
int a = 1;
int *p = &a;
printf("*p= %d, p= %p\n", *p, p);
f(p);
printf("*p= %d, p= %p\n", *p, p);
return 0;
}
方法二是因为局部变量不成功,方法一就不知道为什么成功了?
我觉得方法一中的*ptr = &b与方法二中的p = &b是一样的,都是把b的地址赋值给指针啊!!(谢谢大家)
应该还没看懂我那个解释。
函数里的代码是局部作用域,第二个方法虽然传过去的是p指针,但是p在main里的参数包括地址信息都被保存在了栈中,传过去的只是一个叫p的指针,一个空壳并且指向a,也可以理解为重新生成的p(也可以叫t、c、d随便的),就是继承了main里p的属性,不是main里p的本体,改变 t 函数的p指向b,也值是属于 t 函数,回到了main函数里就消失了,代替它的是本体的 p。
再来说第一个方法,第一个方法穿进去的参数是 &p,这个意思是p的根本(地址),就算 t 函数里怎么描述(叫t、c、d)结果都是指向 p 的地址改变了参数指向 b 后那地址也就跟着被改变了。
就像跑得了和尚,跑不了庙。在外面怎么浪都行,回家的地址就在那,但是要是出去浪的时候被搬家了,那是不是只能被迫的去新家,老家就回不去了。就是这个意思,参数都是自己出去浪,第一个把它老家搬了,第二个只是把它样子改了(化妆啥的让人认不出),那回来的时候第一个就要去新家了,第二个还不是要回到原来的老家。
要是还有什么不明白的再问,明白了麻烦点下“最佳答案”
|