两个数字交换需要靠指针,指针的功能多种多样,指针是c语言的灵魂,所以说掌握指针是非常重要的,下面举一些例子来说明数字是如何通过指针进行交换的。
通常交换两个数字我们需要定义一个第三方变量,通过第三变量去保存第一个数的值,再把第二个数的值覆给第一个数,再吧第三变量的值给第二个数。
void Swap1(int a,int b) { int tmp; tmp = a; a = b; b = tmp; } int main() { int a = 20; int b = 10; }这样写并没有交换两个数
两个函数,一个函数的改变要影响另一个函数必须要传指针和解引用 可以看出交换函数不仅仅是数值变换的问题,还包括了数值所在的地址变换的问题。 所以我们可以试想交换地址是否成功
void Swap2(int *a,int*b) { int *tmp; *tmp = *a; *a = *b; *b = *tmp; } int main() { int a = 10; int b = 20; Swap2(&a,&b); printf("%d,%d",a,b); }可以看出程序已经崩溃了!! 在调试过程中可以发现*tmp = *a时已经出现了错误,这是因为有野指针的出现
野指针:没有初始化的指针,也就是没有访问权限的地址,也称为悬挂指针使得当前指针无效。我们在写代码的时候也会经常出现这种问题,出现野指针就会让程序崩溃
既然上面的代码没有初始化指针,那么下面我们继续修改代码 初始化*tmp指针后:
void Swap3(int *a,int *b) { int *tmp = a; a = b; b = tmp; } int main() { int a = 10; int b = 20; printf("交换前:%d,%d",a,b); Swap3(&a,&b); printf("交换后:%d,%d",a,b); return 0 ; }然而初始化的指针也没有交换数字,此时只是交换了a和b的地址,因为没有解引用。 那我们再来解引用试试看
void Swap4(int *a,int *b) { int tmp; tmp = *a; *a = *b; *b = tmp; } int main() { int a = 10; int b = 20; printf("交换前:%d,%d",a,b); Swap4(a,b); printf("交换后:%d,%d",a,b); return 0; }OKKK终于成功交换 我们来总结一下: **第一种情况:**如Swap1:这是我们看到交换时第一个想到的,可是我们观察a与b的地址,可以看出在Swap函数和主函数中,a和b虽然是同一个名字,但是它们的地址不同,一个函数一个地址,两个函数就有两个不同的地址了。就如同,两个都叫张伟的人不可能是同一个人,他们有各自家的地址。所以这样写是完全不能交换的,由此我们就想到了用指针来交换两个数字。 **第二种情况:**如Swap2,聪明的我们使用了指针来解决这个问题,可是!居然没有想到,还有野指针这种东西,没有别人的邀请就随便去他们家,这可是大问题,很没有礼貌的好嘛。。我们知道任何指针没有初始化是不会变成NULL指针的,所以野指针是导致程序崩溃的原因! 第三种情况如Swap3,我们改正上面的错误,可是发现,还是没能交换,在学习指针时,老师一再强调,指针要解引用才能直到地址中的值,就像一个包裹一样,打开才知道里面是什么,我们这一步只是交换了包裹,并没有打开包裹取出里面的宝物。 总的来说子函数的改变要想影响到父函数,必须传指针,必须解引用!!