【C语言】两个变量值的交换——指针
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语言】两个变量值的交换——指针相关推荐
- 通过位运算进行两个变量值的交换功能
通过位运算进行两个变量值的交换功能 一般交换方法 通常的交换两个变量a,b的过程为 int temp; temp=a a=b; b=temp; 需借助上面的第3个临时变量temp. 位运算交换方法 采 ...
- java如何用异或符号实现两个变量值的交换
在网上看到如何利用异或来实现两个变量的交换,感觉很方便,但是理解起来优点难度,做个笔记,加深理解. 首先先对异或有个了解: 相同的异或之后则为0,不相同的则为1. a:1000 1010, b:100 ...
- JAVA 两个变量值的交换
1.使用一个中间值. public class Test01 {//两个数的值交换public static void main(String[] args) {int a =1 ;int b = 2 ...
- 不使用第三个变量,实现两个变量值的交换
static void Main(string[] args) { int a = 4, b = 5; Console.WriteLin ...
- c语言 交换两个变量 指针,C语言程序设计第5章“使用指针参数交换两个变量值”案例...
使用指针参数交换两个变量值"案例C主讲教师崔玲玲 5.1 " [案例说明]用函数实现两个变量值的交换使其在主调函数 和被调函数中的值一致.要求用指针变量作为函数参数.程 序运行结果 ...
- 四种“不使用第三方变量就可以交换两个变量值”的方法
问题引入: 遇到交换变量值的问题,通常我们的做法是:定义一个新的变量,借助它完成交换. 代码如下: t = a; a = b; b = t; 在这里插入代码片 但问题的重点是"不使用第三方变 ...
- C#交换两个变量值的多种写法
在学习.Net/C#或者任何一门面向对象语言的初期,大家都写过交换两个变量值,通常是通过临时变量来实现.本篇使用多种方式实现两个变量值的交换. 假设int x =1; int y = 2;现在交换两个 ...
- 交换两个变量值的几种方法-C语言初学者
1.借用一个中间变量交换两个变量 #include<stdio.h> int main() {int i=0;int j =0;int n = 0;printf("请输入两个要交 ...
- RUNOOB python练习题47 交换两个变量值
用来练手的python练习题,原题链接: python练习实例47 题干: 两个变量值互换 在C语言C++中我们要构造一个能交换两个变量值的函数很方便,我们可以使用指针,或者C++中的引用.那么在没有 ...
最新文章
- 使用JMeter压力测试
- Win10+VS2015+EF6.0+MySQL5.6+MVC环境部署和排错
- ng-content的一个实际例子
- 学位论文检测系统的说明与修改
- 华为高管涉嫌受贿已被带走调查
- UVA10341 Solve It【二分】
- C# 版本设计模式(Design Pattern)(转)
- 【转】Netty那点事(一)概述
- 目前项目wordpress插件记录
- atitit.提升兼容性最佳实践 p825.doc
- 企业GDPR安全隐私合规性指南
- linux mencoder,linux下mencoder的一些用法
- 我的世界风格字体 艺术字生成 Textcraft的介绍及使用
- edge浏览器网页翻译失败解决方法
- 电路知识--认识原理图(一)
- 4000元组装电脑配置清单2021 4000元台式电脑组装配置单
- 减半技术实现求a的n次幂
- MySQL数据库的存储引擎
- 【林轩田】机器学习基石(七)——VC维
- HDU4544 湫湫系列故事——消灭兔子