目录

第一种传递方式:按值传递

第二种传递方式:指针传递

第三种传递方式:引用传递

const参数

main()函数的参数


大家都知道,在函数中参数分为实参和形参(参看本篇文章)https://mp.csdn.net/mp_blog/creation/editor/124362297现在我们来详细的看看这两者的区别和使用,简单的来说,形参就是一个可以操作的容器,实参就是里面的类容,而参数传递就是传递实参。

第一种传递方式:按值传递

对于基本类型的参数来说,按值传递就是简单的将实参的值赋给形参。

//函数参数传递
//作者:分解机226#include <iostream>
using namespace std;void bl(int intnum, float floatnum, string str)
{cout << "打印整数" << intnum << endl;cout << "打印浮点数" << floatnum << endl;cout << "打印字符串" << str << endl;
}int main()
{int a = 5201314;float b = 1.0f;string str = "asjkdhaskjdl";bl(a, b, str);return 0;
}

运行结果

在实例中分别取3种类型的参数传递,对于整型和浮点型来说就是简单的赋值,但是string是一种自定义对象,把它拷贝到形参时需要调用string重载的赋值运算符进行拷贝。

第二种传递方式:指针传递

指针传递实质上就是一种按值传递,只是将一般类型换为了指针,由于自定义的对象大小可能会很大,赋值拷贝就比较浪费时间,在这种情况下,指针的效率就非常的高。因为它只需要传递地址的大小的数据。

//函数参数传递
//作者:分解机226#include <iostream>
using namespace std;void bl(int a, int b)
{int temp = a;a = b;b = temp;cout << "a交换后的值为" << a << "交换后的b" << b << endl;
}int main()
{int a = 520;int b = 1314;cout << "交换前的a" << a << "交换前的b" << b << endl;bl(a, b);cout << "交换后a" << a << "交换后b" << b << endl;return 0;
}

运行结果

我们可以看到,在运行了bl函数后,形参a和b是交换成功的,但是为什么之后又没有交换成功了呐。这是因为形参本质上是作用域仅限于函数内部的局部变量,实参只是把值赋值给了形参,出来函数后作用域消失了,而实参还是原来的样式,用个例子来讲就是,一个人将一份文件复制了一份再放入原文件夹中,当修改复制文件的时候,原文件是不会改变的。下面我们来用指针来实现数字的交换。

//函数参数传递
//作者:分解机226#include <iostream>
using namespace std;void bl(int *a, int *b)
{int temp = *a;*a = *b;*b = temp;cout << "a交换后的值为" << *a << "交换后的b" << *b << endl;
}int main()
{int a = 520;int b = 1314;cout << "交换前的a" << a << "交换前的b" << b << endl;bl(&a, &b);cout << "交换后a" << a << "交换后b" << b << endl;return 0;
}

运行结果

在本次程序中,a和b就保留了交换,这是因为我们传递的是地址,在打印的时候编译器就是取地址中的值。还是举个例子这次员工放入文件夹的是一个小字条,上面记载这文件电子档的网盘链接,当文件发送给编译者时,工作人员就可以通过链接修改原文件了。

第三种传递方式:引用传递

//函数参数传递
//作者:分解机226#include <iostream>
using namespace std;void bl(int &a, int &b)
{int temp = a;a = b;b = temp;cout << "a交换后的值为" << a << "交换后的b" << b << endl;
}int main()
{int a = 520;int b = 1314;cout << "交换前的a" << a << "交换前的b" << b << endl;bl(a, b);cout << "交换后a" << a << "交换后b" << b << endl;return 0;
}

在引用传递中就是把*改为&。比较简单。就不做过多的描述了。

const参数

我们在设计函数时首先要考虑的就是函数用来干什么后,我们就可以考虑函数的具体实现了,为了防止在实现函数的时候不能修改参数,我们可以使用const关键词修饰参数。

//函数参数传递
//作者:分解机226#include <iostream>
using namespace std;char bl(const string& str)
{//把下面一行设为注释就可以运行str[str.length() - 1] = 's';return str[str.length() - 1];
}int main()
{string str = "hello";cout << "字符串最后一个字符为:" << bl(str) << endl;return 0;}

在本例中由于函数修改了字符串中的字符,违反了const语句,编译器就会报错。

main()函数的参数

main()函数作为主函数,在前面参数列表都是空的,其实它是可以又参数的,有参数的main()函数是这样的int main(int  argc,char*argv[]),或者是int main(int  argc,**argv)

//函数参数传递
//作者:分解机226#include <iostream>
using namespace std;int main(int argc, char** argv)
{int sum = 0;for (int i = 0; i < argc; i++){sum += atoi(argv[i]);}cout << "输入所有数总和为:" << sum << endl;return 0;
}

本程序需要在命令行窗口后面加上参数,才可以运行

谢谢

C++函数参数传递详解相关推荐

  1. uboot linux内核传递参数,Uboot与Linux之间的参数传递详解

    原标题:Uboot与Linux之间的参数传递详解 U-boot会给Linux Kernel传递很多参数,如:串口,RAM,videofb等.而Linux kernel也会读取和处理这些参数.两者之间通 ...

  2. c语言 is函数,关于C语言回调函数的详解~

    原标题:关于C语言回调函数的详解~ 01 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下, ...

  3. python lambda函数-Python的Lambda函数用法详解

    在Python中有两种函数,一种是def定义的函数,另一种是lambda函数,也就是大家常说的匿名函数.今天我就和大家聊聊lambda函数,在Python编程中,大家习惯将其称为表达式. 1.为什么要 ...

  4. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

  5. R语言tidyr包gather()函数实战详解:数据收缩、从宽表到窄表

    R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 目录 R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 收缩两列数据

  6. R语言tidyr包spread()函数实战详解:数据裂变、从窄表到宽表

    R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表 目录 R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表

  7. R语言tidyr包Unite()函数实战详解:多个数据列合并为一列

    R语言tidyr包Unite()函数实战详解:多个数据列合并为一列 目录 R语言tidyr包Unite()函数实战详解:多个数据列合并为一列

  8. R语言tidyr包separate()函数实战详解:一列裂变为多列

    R语言tidyr包separate()函数实战详解:一列裂变为多列 目录 R语言tidyr包separate()函数实战详解:一列裂变为多列 一列裂变为两列

  9. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

最新文章

  1. java练气期(3)----java高级(网络编程)
  2. 一个torch版本报错
  3. Android笔记 style样式
  4. Vue项目报错:This relative module was not found
  5. springboot 全局异常处理类
  6. Springboot 5.Springboot 返回cookies信息的post接口开发
  7. 20201125 plecs更新
  8. Java项目集成工作流引擎解决方案及实例展示(前后分离版)
  9. 三星s9刷android9,三星S9港版安卓9rom系统线刷包:TGY-G9600ZHU5CSG8-刷机之家
  10. Unity -- 正交/透视相机切换(2D/3D相机切换)
  11. 浅析汽车芯片信息安全之安全启动
  12. 微信公众号项目录音上传功能
  13. 根据音乐播放进度实时更新音乐播放器播放进度条
  14. kf 和 ekf 和 ukf 入门
  15. 作业帮猿辅导们的隐忧:下沉市场真的是在线教育的菜?
  16. loadrunner入门教程(31) --Analysis
  17. erdas监督分类(一)
  18. 记录一次使用DDNS动态域名解析服务外网通过域名访问内网服务器服务的过程
  19. c语言如何自动生成word,C语言读取word文档的方法
  20. 什么是云服务器主机?

热门文章

  1. Vue组件通信以及.sync修饰符的使用
  2. 如何把word文案直接转PPT
  3. 软件学院软件工程学费_为什么我不去软件工程学院
  4. 最近开发的基于Excel的考试系统---VBA
  5. 3Dmax怎么做立体的发光灯片? 3Dmax粉丝灯牌的建模方法
  6. 学习是我快乐 第十五天
  7. 用python画条形图
  8. NDK OpenGL ES 3.0 开发(一):绘制一个三角形
  9. 字符串的KMP算法--Python实现
  10. 抑郁症会发展成精神分裂症?这些真相越早知道越好!