关于如何通过Swap函数交换两个变量的值
数据交换在C语言中十分常见。作为初学者首先学的应该都是如下方式:
int main()
{int a = 10;int b = 20;int tmp = a;a = b;b = tmp;printf("%d,%d\n",a,b);return 0;
}
这种交换如果放在一个函数中没错,但如果将它们分别放在子函数和主函数中就会发生错误。
错误示例1:
void Swap(int a,int b)
{int tmp = a;a = b;b = tmp;
}
int main()
{int a = 10;int b = 20;Swap(&a,&b); printf("%d,%d\n",a,b);return 0;
}
其结果是打印出来的a,b值并没有交换。这是因为在子函数中定义的形参(a b)和主函数中的实参(a b)虽然函数名相同,但是其地址并不相同。导致的结果是子函数交换的是形参的数值,对主函数中实参的数值结果并不影响,所以输出的结果没有交换。
错误示例2:
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;
}
这个函数的输出结果也是a,b值没有交换。首先定义两个整形指针*p1,*p2它们分别指向a,b(p1=&a ,p2=&b)。定义一个整形指针*tmp。将变量p1的值赋给指针tmp(变量p1的值为a的地址,因为并没有解引用),将变量p2的值赋给p1(p2的值为b的地址),再将变量tmp的值赋给p2。这样操作下来实际只是将p1,p2保存的地址交换,结果由原来p1=&a ,p2=&b变为现在p1=&b,p2=&a。所以a,b的值并没有改变。
错误示例3:
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;
}
错误三中定义的整形指针*tmp未被初始化,形成了一个野指针(也叫悬挂指针),你没有访问权限的地址(指针),这个指针有可能不存在,也有可能存在但是你不能访问。在出现野指针后,整个程序会崩溃,无法输出你想要的结果。
正确示例:
#include<stdio.h>
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;
}
tmp = *p1;意思为将a的值赋给tmp,所以
void Swap(int *p1,int *p2)
{int tmp;tmp = *p1;*p1 = *p2;*p2 = tmp;
}
的本质是
int tmp = a;a = b;b = tmp;
只不过是通过指针的方式将主函数的数据修改为子函数的数据。换句话说:子函数的改变要想影响主函数的数据必须传指针和解引用.
关于如何通过Swap函数交换两个变量的值相关推荐
- 通过Swap函数交换两个变量的值
正确代码: void Swap(int *p1,int *p2) {int tmp;tmp = *p1;*p1 = *p2;*p2 = tmp; } 定义一个整形变量tmp,p1=&a ,p2 ...
- C语言如何使用函数交换两个变量的值
函数交换变量值 首先咱们先来看一下平常咱们会想到的一个方法 定义一个临时变量来交换数值 #include<stdio.h> #include<stdlib.h> void sw ...
- 函数交换两个变量java_java 编写函数 交换两个基本变量的值
java 编写函数 交换两个基本变量的值 Java编写一个函数交换两个变量的值 Java函数在传递过程中只能够传值,不能传址.这样,函数的参数在函数内部做任何变化就都不会反映到外部调用者来.所以解决之 ...
- 不使用第三个变量来交换两个变量的值
前言 在一些公司的面试中可能会有些面试官会出一些奇奇怪怪的问题,比如怎么样计算1加到100的和要求不能使用加法,减法,循环和if判断,再比如怎么样不用第三个变量来交换两个变量的值等问题.这里我们先分析 ...
- 简单算法实现交换两个变量的值
谈到算法,好多人都感到脑壳疼,我也不例外.主要是平时工作忙,下班了还有各种进步,基本对算法这一块研究的较少.算法可以称之为前辈智慧的结晶.算法的好坏更多的是从时间复杂度,空间复杂度来考量的.对于我 ...
- PHP中不用第三个变量交换两个变量的值
相信大家在PHP面试或者学习中经常会遇到这个问题就是"不用第三个变量来交换两个变量的值",今天正对这个问题来讨论一下: 第一种方法:首先会想到的 这种方法简单可行,顺利的交换了两个 ...
- C语言中的关键字,变量的定义,变量的命名规则,交换两个变量的值,驼峰命名法【 C语言变量名命名法则】
C语言结构 C语言中的关键字 变量 变量的定义 变量的命名规则 交换两个变量的值 驼峰命名法 C语言结构 上图中我们可以看到最外层是程序,内部是所有的构成,我们从最里面开始说明. 当我们用计算机语言来 ...
- Python中有几种办法交换两个变量的值?
交换两个变量的值方法,这个面试题如果只写一种当然很简单,没什么可以说的.今天这个面试是问大家有几种办法来实现交换两个变量的值 .在没开始看具体答案前,你可以先想想看 . 下面分别来说说这几种方法: 1 ...
- python交换两个变量的值_python交换两个变量的值方法
python交换两个变量的值方法 大部分语言,例如c语言,交换两个变量的值需要使用中间变量. 例如交换a,b 伪代码: tmp = a a = b b = tmp python里面可以实现无临时变量的 ...
最新文章
- Glide源码(基于4.8版本)解析
- 将中缀表达式转化为后缀表达式
- 2019考研调剂信息 计算机专业,东莞理工学院2019年考研调剂信息(计算机科学与技术、环境工程专业)...
- Android中的Touch事件
- sm4 的s盒_SM4国密算法Java版
- Git的多人协作和分支处理测试
- 三星“打法”:先模仿对手 再吃掉对手
- 反汇编基础-寄存器及内存
- 大数据学习系列----大数据项目的思考
- 转:如何把 SQL Server 的自增标志列清零
- tex中让公式和文字在一行_1行代码搞定LaTeX公式编写,这个4.6M的Python小插件,堪称论文必备神器...
- Mysql:语法:标志符、关键字
- 疫情可视化--2.爬虫--百度迁徙的疫情数据(各省市各个时间段迁入迁出比例)
- 《Web安全之深度学习实战》笔记:第三章 循环神经网络
- python英文情绪识别_Python能识别文字情绪?
- 解决selenium自动关闭浏览器
- dellr720服务器做系统,DellR720服务器操作系统的安装与重装
- 运行java程序需要的工具软件的目录,运行Java程序需要的工具软件所在的目录是A.JDK的bin目录B.JDK的demo目录C.JDK的lib目录D.JDKR的j...
- 异构网络-元图、知识图谱
- javaWeb(1)———基础
热门文章
- 项目包ExpressJS入门指南
- keilU5中.lib文件的生成与调用
- 程序员笔记软件cherrytree推荐
- python界面教学视频_tkinter 窗口可视化你的 Python程序GUI教学
- 身份证OCR识别发展史
- Java 获取本地时间与网络时间
- 广东开放大学形考任务财务会计(二)(专,2022秋)形成性考核3答案
- html中创建学生对象,在考生文件夹下,存在一个数据库文件“sampl.mdb”。在数据库文件中已经建立了一个表对象“学生基本情...
- vue 什么是渐进式 响应式 意思。Vue常用的指令。VUE:跨域设置。vue router 新窗口。$router.push。
- 深度网络的训练经验总结(参数篇)