Swap函数初总结

Swap(交换)函数,我们一直都在使用,原理也很简单,借助于一个第三方(临时)变量,来达到交换的目的。为了使得程序的可移植性更高,我们希望通过功能函数来实现特定的功能,今天就总结一下Swap函数实现的具体过程及可能出现的问题:

  1. 通过主函数来实现:
int main()
{
    
    
	int a = 10;
	int b = 20;
	printf("%d,%d\n",a,b);

	int tmp = a;
	a = b;
	b = tmp;
	printf("%d,%d\n",a,b);

	return 0;
}
  1. 通过功能函数来实现(可能存在的错误写法):
void Swap_err1(int a,int b)//必须传指针
{
    
    
	int tmp = a;
	a = b;
	b = tmp;
}

这是第一种错误写法,错误的地方在于,没有传指针,导致的结果是,主函数里调用此函数时传进来的两个实参分别作为了该函数的整型变量b、a的值(参数传递时为右结合),通过此函数,交换了变量a和b的值,至此函数结束,在栈区创建的内存被回收,变量a、b不复存在,主函数中两个实参并没有得到交换。

void Swap_err2(int *p1,int *p2)//没有解引用
{
    
    
	int *tmp = p1;
	p1 = p2;
	p2 = tmp;
}

这是第二种错误写法,错误的地方在于没有解引用,该函数通过参数传递进来两个实参的地址作为指针变量p2、p1的值,接着定义了一个新的指针变量tmp赋初值为p1的地址,接着实现了p1、p2两个变量值的交换,但是此时p1、p2是指针变量,其内保存的值为地址,交换p1、p2的值,只是交换了两个地址,并没有对地址所对应的值进行交换,故该函数也失败了。

//野指针,悬挂指针
void Swap_err3(int *p1,int *p2)
{
    
    
	int *tmp;//150
	*tmp = *p1;//崩溃
	*p1 = *p2;
	*p2 = *tmp;
}

这是第三种错误写法,错误之处在于在功能函数内部定义了一个野指针,所谓野指针(悬挂指针)通俗来讲就是指你没有访问权限的地址。由于没有对该野指针进行赋初值,其值为系统的随机值,无法确定,随后将p1所在地址的值赋给野指针指向的空间时,程序崩溃,因为野指针的值为随机值,我们没有访问权限。故此失败。

  1. 通过功能函数来实现(正确写法):
void Swap(int *p1,int *p2)//ok
{
    
    
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

综上所述,我们可以总结出如下规律:
如果一个函数想要实现修改另一个函数的值:
必须做到:
1:传指针;
2:解引用。

猜你喜欢

转载自blog.csdn.net/m0_46308273/article/details/104998955
今日推荐