首页 > 代码库 > 关于swap函数传值的问题

关于swap函数传值的问题

#include <stdio.h>
void swap(int * p3,int * p4);
int main()
{
 int a = 9;
 int b = 8;
 int * p1 = &a;
 int * p2 = &b;
  
 printf("%x %x\n",p1,p2);
 swap(p1,p2);
  
 printf("%d %d\n",a,b);
 printf("%d %d\n",*p1,*p2);
  
 printf("%x %x\n",p1,p2); 
  
 return 0;
}
void swap(int * p3,int * p4)
{
 int * t;
 t = p3;
 p3 = p4;
 p4 = t;
}

初学c的指针类型时,一定都会写这样一个程序,就是利用函数交换两个值。

上面的代码也是很容易想到的,但是这段代码的结果是错误的!!!原因是一个函数是不能有多个返回值的!!

如果有多个值要返回时,就要使用向上通信(即实参为变量的地址)的方法。

在单步调试的过程中,我们也能看到前后两次的地址是没有发生变化的。

如果你用单步调试,你可以看到的是p3和p4的值的确发生了变化,也就是说p3和p4指向的内存的确交换了,但是这种交换却没有影响到p1和p2,p1和p2指向的内存是没有发生变化的。

也就相当于swap函数只是做了p3和p4中存放的地址的值交换。

ps:在对地址(指针)直接进行操作的时候,可以把int * 看作是一个整体int,那么在对p3,p4的变化就相当于是对两个int型变量的变化,被调用函数中int型变量的变化如果不用返回值当然不能带回主函数,但如果使用返回值,却不能带回两个值,所以要使用指针类型。

关于swap函数传值的问题