C语指针问题

来源:百度知道 编辑:UC知道 时间:2024/06/09 04:07:22
#include<stdio.h>
void F(int *p1,int *p2)
{
int *t;
if(*p1 < *p2)
{
t = p1;
p1= p2;
p2 = t;
}
}
void main()
{
int a = 3,b = 4;
int *pp1 = &a;
int *pp2 = &b;
F(pp1,pp2);
printf("%d %d",*pp1,*pp2);
}
刚才见别人提问,我单步调试了一下,在F函数里他们确实交换了引用,可是回到主函数后却还是一样,为什么

我刚刚在那边有解释,可是这个问题我怎么说呢。。

这样 *pp1 与*p1 是对应的一对指针
*pp2 与 *p2 是一对
你在F(pp1,pp2);中吧pp1的地址传给了p1
把 pp2的地址传给了p2
但是你要注意到 现在你只是分别把两个不同的指针指向了一个地址而已 (pp1 p1指向一个地址,pp2 p2指向一个地址)
而在函数体内 只是交换了p1 p2所指向的地址
而与其对应的pp1 pp2指针所指的地址并没有发生改变 输出的时候当然没有变化
不知道我这么说你能不能明白

#include<stdio.h>
void F(int *p1,int *p2)
{
int t;
if(*p1 < *p2)
{
t = *p1;
*p1= *p2;
*p2 = t;
}
}
void main()
{
int a = 3,b = 4;
int *p1 = &a;
int *p2 = &b;
F(p1,p2);
printf("%d %d",*p1,*p2);
}
这样写就可以了 ,我也看不明白怎么回事,我从来没那么写过。

p1与p2是在F中定义的值,要回传,形参必须是指针的指针
void F(int **p1,int **p2) {
int *t;
....
t=*p1;
*p1=*p2;
*p2=t;
...
}

你的pp1和pp2只是分别指向存放a,b的地址的内存地址,也就是说*pp1 ,*pp2 指向的是一个内存地址,所以他们的大小与a,b的值无关,只跟程序运行时地址分配有关。
因此你调用函数也是屋意义的。