数据交换在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函数交换两个变量的值相关推荐

  1. 通过Swap函数交换两个变量的值

    正确代码: void Swap(int *p1,int *p2) {int tmp;tmp = *p1;*p1 = *p2;*p2 = tmp; } 定义一个整形变量tmp,p1=&a ,p2 ...

  2. C语言如何使用函数交换两个变量的值

    函数交换变量值 首先咱们先来看一下平常咱们会想到的一个方法 定义一个临时变量来交换数值 #include<stdio.h> #include<stdlib.h> void sw ...

  3. 函数交换两个变量java_java 编写函数 交换两个基本变量的值

    java 编写函数 交换两个基本变量的值 Java编写一个函数交换两个变量的值 Java函数在传递过程中只能够传值,不能传址.这样,函数的参数在函数内部做任何变化就都不会反映到外部调用者来.所以解决之 ...

  4. 不使用第三个变量来交换两个变量的值

    前言 在一些公司的面试中可能会有些面试官会出一些奇奇怪怪的问题,比如怎么样计算1加到100的和要求不能使用加法,减法,循环和if判断,再比如怎么样不用第三个变量来交换两个变量的值等问题.这里我们先分析 ...

  5. 简单算法实现交换两个变量的值

      谈到算法,好多人都感到脑壳疼,我也不例外.主要是平时工作忙,下班了还有各种进步,基本对算法这一块研究的较少.算法可以称之为前辈智慧的结晶.算法的好坏更多的是从时间复杂度,空间复杂度来考量的.对于我 ...

  6. PHP中不用第三个变量交换两个变量的值

    相信大家在PHP面试或者学习中经常会遇到这个问题就是"不用第三个变量来交换两个变量的值",今天正对这个问题来讨论一下: 第一种方法:首先会想到的 这种方法简单可行,顺利的交换了两个 ...

  7. C语言中的关键字,变量的定义,变量的命名规则,交换两个变量的值,驼峰命名法【 C语言变量名命名法则】

    C语言结构 C语言中的关键字 变量 变量的定义 变量的命名规则 交换两个变量的值 驼峰命名法 C语言结构 上图中我们可以看到最外层是程序,内部是所有的构成,我们从最里面开始说明. 当我们用计算机语言来 ...

  8. Python中有几种办法交换两个变量的值?

    交换两个变量的值方法,这个面试题如果只写一种当然很简单,没什么可以说的.今天这个面试是问大家有几种办法来实现交换两个变量的值 .在没开始看具体答案前,你可以先想想看 . 下面分别来说说这几种方法: 1 ...

  9. python交换两个变量的值_python交换两个变量的值方法

    python交换两个变量的值方法 大部分语言,例如c语言,交换两个变量的值需要使用中间变量. 例如交换a,b 伪代码: tmp = a a = b b = tmp python里面可以实现无临时变量的 ...

最新文章

  1. Glide源码(基于4.8版本)解析
  2. 将中缀表达式转化为后缀表达式
  3. 2019考研调剂信息 计算机专业,东莞理工学院2019年考研调剂信息(计算机科学与技术、环境工程专业)...
  4. Android中的Touch事件
  5. sm4 的s盒_SM4国密算法Java版
  6. Git的多人协作和分支处理测试
  7. 三星“打法”:先模仿对手 再吃掉对手
  8. 反汇编基础-寄存器及内存
  9. 大数据学习系列----大数据项目的思考
  10. 转:如何把 SQL Server 的自增标志列清零
  11. tex中让公式和文字在一行_1行代码搞定LaTeX公式编写,这个4.6M的Python小插件,堪称论文必备神器...
  12. Mysql:语法:标志符、关键字
  13. 疫情可视化--2.爬虫--百度迁徙的疫情数据(各省市各个时间段迁入迁出比例)
  14. 《Web安全之深度学习实战》笔记:第三章 循环神经网络
  15. python英文情绪识别_Python能识别文字情绪?
  16. 解决selenium自动关闭浏览器
  17. dellr720服务器做系统,DellR720服务器操作系统的安装与重装
  18. 运行java程序需要的工具软件的目录,运行Java程序需要的工具软件所在的目录是A.JDK的bin目录B.JDK的demo目录C.JDK的lib目录D.JDKR的j...
  19. 异构网络-元图、知识图谱
  20. javaWeb(1)———基础

热门文章

  1. 项目包ExpressJS入门指南
  2. keilU5中.lib文件的生成与调用
  3. 程序员笔记软件cherrytree推荐
  4. python界面教学视频_tkinter 窗口可视化你的 Python程序GUI教学
  5. 身份证OCR识别发展史
  6. Java 获取本地时间与网络时间
  7. 广东开放大学形考任务财务会计(二)(专,2022秋)形成性考核3答案
  8. html中创建学生对象,在考生文件夹下,存在一个数据库文件“sampl.mdb”。在数据库文件中已经建立了一个表对象“学生基本情...
  9. vue 什么是渐进式 响应式 意思。Vue常用的指令。VUE:跨域设置。vue router 新窗口。$router.push。
  10. 深度网络的训练经验总结(参数篇)