三种传值方式遇上两个数的交换

简介:   最近在学习数据结构的时候发现以前学的C++的有些东西都忘了,特别是老师提到的三种传值的方式——单向值传递,地址传递,双向引用传递;为此,我这里用如何交换两个数的例子来说明一下三种传值方式的机制。     先看看源代码: 1 #include 2 using namespace st...

  最近在学习数据结构的时候发现以前学的C++的有些东西都忘了,特别是老师提到的三种传值的方式——单向值传递,地址传递,双向引用传递;为此,我这里用如何交换两个数的例子来说明一下三种传值方式的机制。

    先看看源代码:

 1 #include<iostream>
 2 using namespace std;
 3 int swap1(int m1,int m2)//单向值传递
 4 {
 5         int temp = m1;
 6         m1 = m2;
 7         m2 = temp;
 8         cout<<m1<<" "<<m2<<endl;
 9         return 0;
10 
11 }
12 int swap2(int *m1,int *m2)//地址传递
13 {
14         int temp = *m1;
15         *m1 = *m2;
16         *m2 = temp;
17         cout<<*m1<<" "<<*m2<<endl;
18         return 0;
19 
20 }
21 int swap3(int &m1,int &m2)//双向引用传递
22 {
23         int temp = m1;
24         m1 = m2;
25         m2 = temp;
26         cout<<m1<<" "<<m2<<endl;
27         return 0;
28 }
29 void main()
30 {
31         int a1 = 13,b1 = 23;
32         swap1(a1,b1);
33         cout<<a1<<" "<<b1<<endl;
34         cout<<endl;
35         int a2 = 11,b2 = 22;
36         swap2 (&a2,&b2);//将地址的值作为函数的参数
37         cout<<a2<<" "<<b2<<endl;
38         cout<<endl;
39         int a3 = 10,b3 = 20;
40         swap3(a3,b3);
41         cout<<a3<<" "<<b3<<endl;
42 }

程序运行截图:

 

一·单向值传递:

       在上面的代码中,第一个交换函数使用的是单向传值,从程序运行结果看,a1与和b2并没有交换,这是为什么呢,大家再看一下这个程序:

 

#include<iostream>
using namespace std;
void add(int m)
{
    m = m + 1;
}
void main()
{
    int n = 10;
    add(n);
    cout<<n<<endl;
}

  最后输出的结果是10,而并非11,这就很好的解释了单向传递:数值只能由实参传给形参,而不能倒过来,即由形参传给实参,这是因为这里调用函数swap()时,把n = 10 这个数值10传给了形参m,当调用函数swap()完之后,虽然m的值是由10加了一个1成了11,但是这并不会被保存起来,因为当调用函数完之后所有的形参都会被释放,然而这一切与n并没有关系,因为是n的数值作为形参,而并不是n本身,程序运行结果n的值并不会改变。

二.地址传递:

       第二个函数使用的是地址传递方式,从程序运行结果来看使用这种传值的方式可以交换两个数,这是什么原理呢,我们将上面的小程序修改一下:

#include<iostream>
using namespace std;
void add(int *m)//使用指针达到实参与形参双向传递的功能
{
    *m = *m + 1;
}
void main()
{
    int n = 10;
    add(&n);//把n的地址作为形参
    cout<<n<<endl;
}

  程序运行的结果是11,这种改变就是地址传递的作用,我们在调用函数时,把n的地址(&n的作用是去取n的地址)作为形参,这样形参就和实参挂钩了,形参m和实参n共用一个地址,调用函数形参加了一个1,m变成了11,所以此地址上的值变成了11,而实参n的地址就是形参m的地址,所以实参n的值也变成了11。

 三.引用传递:

  上文最后一个交换函数使用的是引用传递的方式,这种传值的方法也可以交换两个数。引用传递就是给实参取了个别名。引用传递没有自己单独的内存空间,他和实参共用一段内存,对形参的任何修改即相当于对实参的相同方式的修改,实现的是形参和实参的双向传递。这种传递方式好记又好用。

目录
相关文章
|
弹性计算 NoSQL 关系型数据库
ECS迁移问题之ECS往本地迁移如何解决
ECS(Elastic Compute Service,弹性计算服务)是云计算服务提供商提供的一种基础云服务,允许用户在云端获取和配置虚拟服务器。以下是ECS服务使用中的一些常见问题及其解答的合集:
|
SQL 分布式计算 数据处理
Uber基于Apache Hudi增量 ETL 构建大规模数据湖
Uber基于Apache Hudi增量 ETL 构建大规模数据湖
322 2
|
机器学习/深度学习 存储 数据可视化
生成对抗网络项目:1~5(2)
生成对抗网络项目:1~5(2)
254 0
|
运维 监控
浅析SPI与CAN通信
SPI是一种常用的MCU与外设的通信方式,英文全称Serial Peripheral Interface。与之前介绍过的UART不同,SPI是串行,全双工,同步通信方式。SPI通常有4根物理连接线,分别是CS片选,SCK时钟,MOSI主机输出从机输入和MISO主机输入从机输出。CS片选是从机选择信号线,低电平有效。当CS为低电平时认为主机目前选中的本从机。SCK是串行时钟线,同步通信需要主从机时钟同步,主机利用SCK线与从机实现时钟同步。时钟由主机产生,决定了通讯的速率。
544 0
|
11月前
|
人工智能 监控 安全
智慧工地综合管理云平台SaaS源码:安全、高效、绿色、智能的建筑施工新生态
智慧工地平台通过整合物联网、人工智能、大数据等技术,实现了对工地人员、设备、环境、材料等方面的全面监测和管理。
497 4
|
编解码 监控
使用OBS Studio进行多路直播时,有哪些高级设置可以优化同步性?
使用OBS Studio进行多路直播时,有哪些高级设置可以优化同步性?
|
Prometheus 监控 Cloud Native
【监控】prometheus传统环境监控告警常用配置
【监控】prometheus传统环境监控告警常用配置
【监控】prometheus传统环境监控告警常用配置
|
10月前
|
缓存 搜索推荐 定位技术
PWA 适用于哪些类型的应用
PWA(渐进式网页应用)适用于多种类型的应用,包括新闻、天气、电商、社交、娱乐和工具类应用,能够提供接近原生应用的体验,支持离线访问和快速加载。
|
机器学习/深度学习 自然语言处理
深度剖析Transformer核心思想 "Attention Is All You Need"
深度剖析Transformer核心思想 "Attention Is All You Need"
|
JavaScript 安全 前端开发
介绍DOM Based XSS
【8月更文挑战第25天】介绍DOM Based XSS
232 1