实现Swap函数,将两个数交换

刚刚对指针做了基础的学习,那么指针的作用在哪里呢,我们就用Swap函数作一下分析。

假如我们要交换a和b的值

void Swap(int a, int b)//交换不成功
{
    
    
int tmp = a;
a = b;
b = 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;
}

我们来看图片
在这里插入图片描述
由此看出地址是不同的,在Swap函数中a和b的值交换,并不会影响到main中的变量,在这里仅仅是按值(复制)传递。
如果想在Swap函数中修改main中的值,必须突破不同函数间的限制,那我们必须要引入指针,来看第二个。

void Swap(int *p1,int *p2)//交换不成功
{
    
    
int *tmp = p1;
p1 = p2;
p2 = tmp;
}
int main()
{
    
    
int a = 10;
int b = 20;
Swap(&a,&b);
printf("%d %d\n",a,b)
return 0;
}

我们发现依然不成功,来看一下图。

在这里插入图片描述

由图可以看出,p1和p2的内容确实交换了,但是a,b的值并没有交换,想要交换我们必须得解引用。
来看第三版本

void Swap(int *p1,int *p2)//程序崩溃
{
    
    
int *tmp;
*tmp=*p1;
*p1=*p2
*p2=*tmp;
}
int main()
{
    
    
int a = 10;
int b = 20;
Swap(&a,&b);
printf("%d %d\n",a,b);
return 0;
}

上面的代码在运行时,程序崩溃。在编译时编译器会提醒你使用了未初始化的局部变量。这是因为我们使用了野指针。
野指针:也被叫做悬挂指针,是我们没有访问权限的地址,这个地址有可能是不存在,也有可能是存在但我们不能访问。那么我们把野指针消除,来看第四种:

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;
}

来看执行结果:
在这里插入图片描述
来看一下过程
在这里插入图片描述
![
在这里插入图片描述
结论:被调用函数的改变要想影响到调用函数,必须要1、传指针2、解引用(访问)。
终于写完了。。。

猜你喜欢

转载自blog.csdn.net/Serendipity_00/article/details/111180962