C语言用fun函数实现两个数的交换方式

 更新时间:2022年12月05日 14:18:10   作者:越菜越要努力  
这篇文章主要介绍了C语言用fun函数实现两个数的交换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

用fun函数实现两个数的交换

#include <stdio.h>

void fun(int *x,int *y)//定义fun函数,此时需要注意与main函数时的定义方式相同
{
    int t;//定义一个中间变量,用于让两个数交换留一个位置
    t=*x,*x=*y,*y=t;
}
void main()
{
    int a,b;
    scanf("%d %d",&a,&b);//定义两个交换的数
    fun(&a,&b);
    printf("%d  %d\n",a,b);
}

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

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

出现的错误情况如下:

  • 第一种情况:值传递;(如函数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);//子函数
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C语言实现Linux下的socket文件传输实例

    C语言实现Linux下的socket文件传输实例

    这篇文章主要介绍了C语言实现Linux下的socket文件传输的方法,较为详细的分析了C语言文件Socket文件传输客户端与服务器端相关实现技巧,需要的朋友可以参考下
    2015-06-06
  • C语言超详细讲解字符串函数和内存函数

    C语言超详细讲解字符串函数和内存函数

    这篇文章主要介绍一些c语言中常用字符串函数和内存函数的使用,字符串函数(String processing function)也叫字符串处理函数,指的是编程语言中用来进行字符串处理的函数
    2022-05-05
  • C语言 浅谈栈与队列的定义与操作

    C语言 浅谈栈与队列的定义与操作

    栈和队列,严格意义上来说,也属于线性表,因为它们也都用于存储逻辑关系为 "一对一" 的数据,但由于它们比较特殊,因此将其单独作为一章,做重点讲解
    2021-11-11
  • C++实现十进制数转为其它进制数

    C++实现十进制数转为其它进制数

    这篇文章主要为大家详细介绍了C++实现十进制数转为其它进制数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C语言超详细讲解字符串相乘

    C语言超详细讲解字符串相乘

    这篇文章主要介绍了用C语言如何来实现字符串相乘的方法,这里我们会利用到memset函数,memset函数是对较大的结构体或数组进行清零操作的一种最快方法,可以说是初始化内存的“万能函数”,下面我们详细了解一下
    2022-03-03
  • C++内存管理详细解析

    C++内存管理详细解析

    这篇文章主要给大家分享的是C++内存管理的详细内容学习,下面文章围绕C++内存管理的相关资料展开具体学习内容,需要的朋友可以参考一下,希望对你有所帮助
    2021-11-11
  • C语言学生成绩管理系统源代码

    C语言学生成绩管理系统源代码

    这篇文章主要为大家详细介绍了C语言学生成绩管理系统源代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • C++ Boost PointerContainer智能指针详解

    C++ Boost PointerContainer智能指针详解

    智能指针是一种像指针的C++对象,但它能够在对象不使用的时候自己销毁掉。虽然STL提供了auto_ptr,但是由于不能同容器一起使用(不支持拷贝和赋值操作),因此很少有人使用。它是Boost各组件中,应用最为广泛的一个
    2022-11-11
  • C语言实现的双链表功能完整示例

    C语言实现的双链表功能完整示例

    这篇文章主要介绍了C语言实现的双链表功能,结合完整实例形式分析了基于C语言实现的双链表定义、添加、删除、排序等相关操作实现技巧,需要的朋友可以参考下
    2018-04-04
  • C语言中传值与传指针的介绍与区别

    C语言中传值与传指针的介绍与区别

    这篇文章主要给大家介绍了关于C语言中传值与传指针的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06

最新评论