不太明白你的意思。你是说a>b输出结果正确,a<b输出结果不正确?
另外我没说p1和p2释放掉,是形参被释放掉了,两个指针依然指向该地址,只是地址的内容可能被修改了。
你用值传递的方式,就会造成函数执行结束后,两个指针所指向的单元不受控制。很可能就不是原来的值了。
下图是一个示意图,进入select函数时p1和p2分别指向形参a和b对应的地址单元,select函数执行结束后,p1指向a和b较大的那个数的单元。但是该地址是否还是通过实参传递过来的值就不一定了。这受很多因素的影响,如:编译器,你的电脑内存使用情况等等
你可以看一下函数执行前后p1和p2的地址,看一下a>b和a<b两种情况下地址的变化。
#include<stdio.h>
int *p1,*p2,*p;
int main(){
int a,b;
int select(int a,int b);
scanf("%d%d",&a,&b);
select(a,b);
printf("%d\n",*p1);/*第一个P1,为什么这里的p1和后面两个的输出不同??*/
printf("%d>>%d\n",a,b);
printf("p1->%d,p2->%d\n",p1,p2);
printf("%d--%d\n",*p1,*p2);
return 0;
}
/*要是输出三个p1指针中的地址,却又相同、正确,,是什么情况??*/
int select(int a,int b){
p1=&a;
p2=&b;
printf("p1->%d,p2->%d\n",p1,p2);
if(a<b){
p=p1;
p1=p2;
p2=p;
}
return 0;
}
|