C语言中交换两个变量的值可以在主函数中直接实现,也可以通过子函数来实现。下面我们介绍用子函数实现的情况。

1.将两个变量的值作为实参直接传递,在子函数内部定义一个普通变量来对两个形参进行交换,并分别在子函数和主函数中打印。

#include <stdio.h>  void Swap(int a,int b)
{int tmp = a;a = b;b = tmp;printf("a=%d,b=%d\n",a,b);
}  int main()
{int a = 5;int b = 10;printf("a=%d,b=%d\n",a,b);Swap(a,b);printf("a=%d,b=%d\n",a,b);return 0;
}

下面是程序的运行结果:

从程序的运行结果我们可以看出,在子函数内部两个形参是交换成功了的,但是在主函数中却没有。那是为什么呢?我们进入函数内部来看下。

下面是主函数中a和b的地址及值:

下面是子函数中a和b的地址及值:

可以看出主函数和子函数中a和b的地址不相同,即说明了两个函数中的变量不是同一个,仅仅是同名而已。这说明了两个形参已交换成功,但并未传递给实参,两个实参的值并未发生改变。

2.第一种方法中两个实参并未发生改变,因为其地址并未传递给形参。接下来我们把实参的地址传递给形参,并且定义一个指针变量来对两个形参进行交换,并分别在子函数和主函数中打印。

#include <stdio.h>  void Swap(int *p1,int *p2)
{int *tmp = p1;p1 = p2;p2 = tmp;printf("a=%d,b=%d\n",*p1,*p2);
}int main()
{int a = 5;int b = 10;printf("a=%d,b=%d\n",a,b);Swap(&a,&b);printf("a=%d,b=%d\n",a,b);return 0;
}  

下面是程序的运行结果:

可以看出结果还是同样错误。我们进行测试。

下面是主函数中a和b的地址及值:

下面是子函数中a,b,p1,p2的地址及值:

下面是返回到主函数中四个变量的地址及值:

以上测试结果可以说明主函数在给子函数传参时,传的是主函数中的两个变量的地址,但是在子函数中只是把形参p1和p2所指向的变量的地址进行交换,开始p1指向a,p2指向b,交换之后,p1指向b,p2指向a,没有实质性的将实参a,b的值交换。然后返回到主函数中,a和b依然是原来的值,没有交换。

3.下面在子函数中将实参值进行交换。

#include <stdio.h>  void Swap(int *p1,int *p2)
{  int *tmp;  *tmp = *p1;  *p1 = *p2;  *p2 = *tmp; printf("a=%d,b=%d\n",*p1,*p2);
}  int main()
{  int a = 5;  int b = 10;  printf("a=%d,b=%d\n",a,b);  Swap(&a,&b);  printf("a=%d,b=%d\n",a,b); return 0;
}

以上方法看似没有错误,但是在运行时程序却会崩溃:

上边显示,变量tmp正在被使用却没有被初始化。这种没有被初始化的指针称为野指针,也叫悬挂指针。野指针是没有访问权限的地址(指针)。没有访问权限,形参不能正常交换,所以程序崩溃。

4.下面才是正确的写法。

#include <stdio.h>  void Swap(int *p1,int *p2)
{  int tmp;  tmp = *p1;  *p1 = *p2;  *p2 = tmp;  printf("a=%d,b=%d\n",*p1,*p2);
}  int main()
{  int a = 5;  int b = 10;  printf("a=%d,b=%d\n",a,b);  Swap(&a,&b);  printf("a=%d,b=%d\n",a,b);  return 0;
}  

由此可以总结出学习指针的一个重要知识点:一个函数的改变要影响另一个函数,两个条件:1.传指针;2.解引用。

【C语言】两个变量值的交换——指针相关推荐

  1. 通过位运算进行两个变量值的交换功能

    通过位运算进行两个变量值的交换功能 一般交换方法 通常的交换两个变量a,b的过程为 int temp; temp=a a=b; b=temp; 需借助上面的第3个临时变量temp. 位运算交换方法 采 ...

  2. java如何用异或符号实现两个变量值的交换

    在网上看到如何利用异或来实现两个变量的交换,感觉很方便,但是理解起来优点难度,做个笔记,加深理解. 首先先对异或有个了解: 相同的异或之后则为0,不相同的则为1. a:1000 1010, b:100 ...

  3. JAVA 两个变量值的交换

    1.使用一个中间值. public class Test01 {//两个数的值交换public static void main(String[] args) {int a =1 ;int b = 2 ...

  4. 不使用第三个变量,实现两个变量值的交换

    static void Main(string[] args)         {             int a = 4, b = 5;             Console.WriteLin ...

  5. c语言 交换两个变量 指针,C语言程序设计第5章“使用指针参数交换两个变量值”案例...

    使用指针参数交换两个变量值"案例C主讲教师崔玲玲 5.1 " [案例说明]用函数实现两个变量值的交换使其在主调函数 和被调函数中的值一致.要求用指针变量作为函数参数.程 序运行结果 ...

  6. 四种“不使用第三方变量就可以交换两个变量值”的方法

    问题引入: 遇到交换变量值的问题,通常我们的做法是:定义一个新的变量,借助它完成交换. 代码如下: t = a; a = b; b = t; 在这里插入代码片 但问题的重点是"不使用第三方变 ...

  7. C#交换两个变量值的多种写法

    在学习.Net/C#或者任何一门面向对象语言的初期,大家都写过交换两个变量值,通常是通过临时变量来实现.本篇使用多种方式实现两个变量值的交换. 假设int x =1; int y = 2;现在交换两个 ...

  8. 交换两个变量值的几种方法-C语言初学者

    1.借用一个中间变量交换两个变量 #include<stdio.h> int main() {int i=0;int j =0;int n = 0;printf("请输入两个要交 ...

  9. RUNOOB python练习题47 交换两个变量值

    用来练手的python练习题,原题链接: python练习实例47 题干: 两个变量值互换 在C语言C++中我们要构造一个能交换两个变量值的函数很方便,我们可以使用指针,或者C++中的引用.那么在没有 ...

最新文章

  1. 使用JMeter压力测试
  2. Win10+VS2015+EF6.0+MySQL5.6+MVC环境部署和排错
  3. ng-content的一个实际例子
  4. 学位论文检测系统的说明与修改
  5. 华为高管涉嫌受贿已被带走调查
  6. UVA10341 Solve It【二分】
  7. C# 版本设计模式(Design Pattern)(转)
  8. 【转】Netty那点事(一)概述
  9. 目前项目wordpress插件记录
  10. atitit.提升兼容性最佳实践 p825.doc
  11. 企业GDPR安全隐私合规性指南
  12. linux mencoder,linux下mencoder的一些用法
  13. 我的世界风格字体 艺术字生成 Textcraft的介绍及使用
  14. edge浏览器网页翻译失败解决方法
  15. 电路知识--认识原理图(一)
  16. 4000元组装电脑配置清单2021 4000元台式电脑组装配置单
  17. 减半技术实现求a的n次幂
  18. MySQL数据库的存储引擎
  19. 【林轩田】机器学习基石(七)——VC维
  20. HDU4544 湫湫系列故事——消灭兔子

热门文章

  1. Linux攻关之基础模块十二 进程相关
  2. 学习ARM开发(3)
  3. 根据year年的第week周,查询第week周的起止时间
  4. JDBC之execute、executeQuery和executeUpdate之间的区别
  5. 【数据挖掘】-决策树算法+代码实现(七)
  6. 【正则表达式】从字符串中提取数字
  7. 留存分析_游戏数据分析
  8. Numpy之reshape(1,-1)含义
  9. GBase8s数据库以 RESTRICT 方式或 CASCADE 方式删除安全标签对象
  10. Z 字形变换(Python)