输入两个数,将两个数进行交换,通常我们会定义一个第三变量,然后进行交换。
例如:
#include<stdio.h>
int main()
{
int a=10;
int b=20;
int tmp;
tmp=a;
a=b;
b=tmp;
printf("%d,%d\n",a,b);
}
将它改换一个形式即为:
void Swap(int a,int b)
{
int tmp = a;
a = b;
b = tmp;
//printf("%d,%d\n",a,b);
}
int main()
{
int a = 10;
int b = 20;
printf("%d,%d\n",a,b);
return 0;
}
此时运行结果为:
有运行结果可以看出用方式交换函数是不对的。
两个函数,一个函数的改变要影响另一个函数必须要传指针和解引用
由图分析可以看出交换函数不仅仅是数值变换的问题,还包括了数值所在的地址变换的问题。
而凡是涉及到地址的问题,一般都用指针解决。由图我们看到10从a的地址变到b,20从b的地址变到a,然后我们猜想,如果交换地址,交换函数是否会成功,则有:
#include<stdio.h>
void Swap(int *p1,int *p2)
{
int *tmp;//野指针,悬挂指针
*tmp = *p1;//error
*p1 = *p2;
*p2 = *tmp;
}
int main()
{
int a=10;
int b=20;
printf("%d,%d\n",a,b);
Swap(&a,&b);
printf("%d,%d\n",a,b);
return 0;
}
此次运行结果是:
程序出现崩溃
可见本次程序也是错误的,在调试过程中我发现在进行到*tmp = *p1;时程序就崩溃了,错误显示出:。此时就意味着int *tmp是个野指针,所谓野指针就是没有初始化的指针,该种指针访问的是没有访问权限的指针,也称为悬挂指针,使得当前指针无效。
初始化int *tmp之后:
#include<stdio.h>
void Swap(int *p1,int *p2)//****
{
int *tmp = p1;
p1 = p2;
p2 = tmp;
}
int main()
{
int a = 10;
int b = 20;
printf("%d,%d\n",a,b);
Swap(&a,&b);
printf("%d,%d\n",a,b);
return 0;
}
初始化野指针后,程序运行结果还是不对,此时只是交换了地址,未进行解引用。
再修改为:
#include<stdio.h>
void Swap(int *p1,int *p2)
{
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
int main()
{
int a = 10;
int b = 20;
printf("%d,%d\n",a,b);
Swap(&a,&b);
printf("%d,%d\n",a,b);
return 0;
}
此程序运行结果为:
此时运行结果正确。交换函数运行成功。