void Swap(int *p1,int *p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
printf("功能函数中:a = %d, a = %x ,b = %x,b = %d\n",*p1,p1,*p2,p2);
}
int main()
{
int a = 10;
int b = 20;
printf("函数交换前:a = %d, a = %x ,b = %x,b = %d\n",a,&a,b,&b);
Swap(&a,&b);
printf("函数交换后:a = %d, a = %x ,b = %x,b = %d\n",a,&a,b,&b);
return 0;
}
程序执行结果如下:
上图为指针数据交换逻辑图
普通数值交换
void Swap(int a,int b)
{
int tmp = a;
a = b;
b = tmp;
printf("功能函数中:a = %d, a = %x ,b = %x,b = %d\n",a,&a,b,&b);
}
int main()
{
int a = 10;
int b = 20;
printf("交换前:a = %d, a = %x ,b = %x,b = %d\n",a,&a,b,&b);
Swap(a,b);
printf("交换前:a = %d, a = %x ,b = %x,b = %d\n",a,&a,b,&b);
return 0;
}
程序执行结果如下:
指针数值交换与之前的数值交换不同,指针交换是彻底的交换它将变量的地址中储存的数值一同交换;而之前的数值交换只在功能函数中实现交换,实际地址所储存的数值并没有改变;
普通交换功能函数会给形参开辟新的内存,与实参内存地址无关,只是两块内存所储存的数值相等。而指针交换指针传递的是a和b的实际地址
交换前:p1整形地址变量储存a的地址,*p1解引用为a;p2整形地址变量储存b的地址,*p2解引用为b;
交换后:p1整形地址变量储存a的地址,*p1解引用为b;p2整形地址变量储存b的地址,*p2解引用为a;
通过一个tmp变量实现实际地址中的数据的交换;
交换过程:把*p1赋值给tmp,此时tmp等于变量a,*p2赋值给*p1,此时*p1解引用为变量b,tmp赋值给*p2,此时*p2解引用为变量a;