C:函数交换两个数,常见错误

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41103495/article/details/83215897

                                    函数交换两个数,常见错误

问题:提供俩个数,利用函数实现交换。

出现的错误情况如下:

        第一种情况:值传递;(如函数Swap_err01)

        第二种情况:没解引用;(如函数Swap_err02)

        第三种情况:悬挂指针。(如函数Swap_err03)

能实现交换两个数的函数,在函数Swap可以实现。

代码如下:

#include <stdio.h>
void Swap_err01(int a,int b)
{
	int tmp;
	tmp = a;
	a = b;
	b = tmp;
}
void Swap_err02(int *p1,int *p2)
{
	int *tmp = p1;
	p1 = p2;
	p2 = tmp;
}
void Swap_err03(int *p1,int *p2)
{
	int *tmp;
	*tmp = *p1;
	*p1 = *p2;
	*p2 = *tmp;
}
void Swap(int *p1,int *p2)
{
	int tmp;
	tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}
int main ()
{
	int a=10;
	int b=20;
	printf("a=%d,b=%d\n",a,b);
	
	//Swap_err01(a,b);	
	//Swap_err02(&a,&b);	
	//Swap_err03(&a,&b);
	Swap(&a,&b);

	printf("a=%d,b=%d\n",a,b);	
	return 0;
}

编译结果如下:

函数Swap_err01的编译结果:

                                           

        由结果可见,按值传递,不能达到交换两个数。按值传递: 函数内部使用的参数称为形参,是通过拷贝实参而来,从而对其进行修改,所以,对原来的实参不会造成修改。 如下图所示,内部变量互不影响。

                                     

函数Swap_err02的编译结果:

                                           

        由结果可见,换位失败,其主要原因就是因为没有解引用,过程可看下图。

                                          

函数Swap_err03的编译结果:

                                           

         由编译结果可见,实行函数的时候,编译器(Visual Studio 2012)报错了,内容是变量tmp没有被定义,其主要原因是,*tmp为悬挂指针(野指针),野指针:没有访问权限的指针(地址)。

函数Swap的编译结果:

                                           

        由结果可见,实现了两个数换位,解引用之后,将地址内的值换位。其过程如下图:

                                              

   注意:子函数的改变能影响到父函数,一定要传指针和解引用,两个条件缺一不可。

int main ()//父函数
{
    Fun(&a,&b);//子函数
}

猜你喜欢

转载自blog.csdn.net/qq_41103495/article/details/83215897