要求:通过调用函数实现两个值的交换
例如:输入5,9 —– 输出9,5
不能到达预期的结果的代码
#include<stdio.h>
void main()
{
void swap(int *p1, int *p2);
int a,b;
int *pointer_1,*pointer_2;
scanf("%d,%d",&a,&b);
pointer_1 = &a;
pointer_2 = &b;
printf("指针pointer_1、pointer_2初始化的地址(自身) %d %d\n", &pointer_1, &pointer_2); //1703732 1703728
printf("指针pointer_1、pointer_2存储的值 %d %d\n", pointer_1, pointer_2); //1703740 1703736
printf("\n");
printf("a,b交换之前的地址 %d %d\n", &a, &b); //1703740 1703736
printf("a,b交换之前的值 %d %d\n", a, b); //5 9
if(a < b)
{
swap(pointer_1,pointer_2);
}
printf("指针pointer_1、pointer_2初始化的地址(自身) %d %d\n", &pointer_1, &pointer_2); //1703732 1703728
printf("指针pointer_1、pointer_2存储的值 %d %d\n", pointer_1, pointer_2); //1703740 1703736
printf("\n");
printf("a,b交换之后的地址 %d %d\n", &a, &b); //1703740 1703736
printf("a,b交换之后的值 %d %d\n", a, b); //5 9
}
void swap(int *p1,int *p2)
{
printf("\n******************调用函数开始****************");
printf("\n");
printf("before_self %d %d\n",&p1,&p2); //1703644 1703648
printf("before_storage_address %d %d\n",p1,p2); //1703740 1703736
printf("before_result %d %d\n",*p1,*p2); //5 9
int *p;
p = p1;
p1 = p2;
p2 = p;
printf("\n");
printf("after_self %d %d\n",&p1,&p2); //1703644 1703648
printf("before_storage_address %d %d\n",p1,p2); //1703736 1703740
printf("after_result %d %d\n",*p1,*p2); //9 5
printf("******************调用函数结束****************\n\n");
}
输出结果
原因
在给a和b分别赋值5,9后,把a的地址1703740给了指针变量pointer_1,把b1703736的地址给了指针变量pointer_2(为了方便,地址用%d输出,不同的PC,情况不同,但是原理都一样)。然后调用函数,把指针存储的值(a、b的地址)传递给P1、P2指针。
swap(pointer_1,pointer_2);
void swap(int *p1, int *p2);
在调用函数的进行交换的代码,可以看出,只是单纯的将各自存储的地址进行交换而已。
int *p;
p = p1;
p1 = p2;
p2 = p;
所以,指针变量只是在调用函数里交换了存储的地址,可以在调用函数里输出9,5。但是一旦调用结束,P1、P2指针变量就会被释放。并没有在根本上进行交换。
能到达预期的结果的代码
只需要将调用函数修改如下:
void swap(int *p1,int *p2)
{
printf("\n******************调用函数开始****************");
printf("\n");
printf("before_self %d %d\n",&p1,&p2); //1703644 1703648
printf("before_storage_address %d %d\n",p1,p2); //1703740 1703736
printf("before_result %d %d\n",*p1,*p2); //5 9
int p;
p = *p1;
*p1 = *p2;
*p2 = p;
printf("\n");
printf("after_self %d %d\n",&p1,&p2); //1703644 1703648
printf("before_storage_address %d %d\n",p1,p2); //1703740 1703736
printf("after_result %d %d\n",*p1,*p2); //9 5
printf("******************调用函数结束****************\n\n");
}
输出结果
原因
修改后的调用函数的指针变量,交换的不再是地址,而是通过地址找到a、b的值,将a、b的值进行交换。
int p;
p = *p1;
*p1 = *p2;
*p2 = p;