C++ 参数的三种传递方式和应用参加

这篇具有很好参考价值的文章主要介绍了C++ 参数的三种传递方式和应用参加。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++ 参数的三种传递方式分别是值传递指针传递引用传递

值传递

值传递的实质

  • 将实参的值(a、b)复制到形参(m、n)相应的存储单元中,即形参和实参分别占用不同的存储单元。

值传递的特点

  • 值传递的特点是单向传递,即主调函数被调用时给形参分配存储单元,把实参的值传递给形参,在调用结束后,形参的存储单元被释放,而形参值的任何变化都不会影响到实参的值,实参的存储单元仍保留并维持数值不变。

值传递的应用场景

  • 适用于传递简单的数据类型,如int、float、double等。传值是将参数的值传递给函数,函数内部会创建一个新的变量来存储该值,对该变量的修改不会影响原变量的值。

例子1:我们首先讲值传递,并且把它的特性列出来。下面我们先看代码:
void test(int a) {
a += 3;
cout << “a的值:” << a << “\n”
<< “a的地址:” << &a << “\n”;
}
void main()
{
int b = 10;
test(b);
cout << “b的值:” << b << “\n”
<< “b的地址:” << &b << “\n”;
}
这是一个简单的值传递,而地址就是内存位置,学过C++的人都清楚,下面是运行的结果

C++ 参数的三种传递方式和应用参加

 根据代码和结果我们可以知道的是值传传递的参数是有自己的内存的,并且当b把自己的值传递进去之后,对b是没有影响的,那么值传递则是等于把b的值赋给了a等于进行了一个赋值操作这就是值传递。

指针传递

指针传递的实质

  • 所谓的地址传递,指的就是函数的参数是数组名或者指针。传递的是数组的首地址或指针的值,而形参接收到的是实参的地址,即指向实参的存储单元,形参和实参占用相同的存储单元,所以形参和实参是相同的。

特点

  • 形参并不存在存储空间,编译系统不为形参数组分配内存。因此在数组名或指针作函数参数时所进行的传送只是地址传送,形参在取得该地址之后,与实参共同拥有一段内存空间,形参的变化也就是实参的变化。

运用场景

  • 适用于传递数组、结构体等复杂的数据类型。指针传递是将参数的地址传递给函数,函数内部通过指针来访问该变量,对该变量的修改会影响原变量的值。

例子2:接下下来我讲指针传递,下面是指针传递的代码:
void test(int *a) {
*a += 3;
cout << “a所指向地址:” << a << “\n”
<< “a的地址:” << &a << “\n”
<< “a所指向地址的值:” << *a << “\n”;
}
void main()
{
int b = 10;
test(&b);
cout << “b的值:” << b << “\n”
<< “b的地址:” << &b << “\n”;
}
这是一个指针传递,可以明显的发现和值传递的差别,指针是存储地址的,当我们想要把b的值传进test()函数时,我们传的是b的地址,然后通过b的地址,来获得b的值,下面是结果
C++ 参数的三种传递方式和应用参加

 我们输出的跟值传递不同的是什么呢,很明显的是这次输出的地址比值传递多一个地址,那这个多的地址和b的地址一模一样,可以说明的是指针传递的是地址,然后还有不同的是b的值也被改变了,这就指针传递和值传递的不同。

引用传递

引用传递的实质

  • 形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。
  • 形参的地址是实参地址的映射,即拥有不同的储存空间但是里面存放的地址相同。

特点

  • 被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

运用场景

  • 适用于传递对象、类等复杂的数据类型。引用传递是将参数的引用传递给函数,函数内部通过引用来访问该变量,对该变量的修改也会影响原变量的值。引用传递与指针传递相似,但使用起来更加简洁明了。

例子3:最后一个是引用传递,引用传递,传递的是什么呢?它和值传递、指针传递不同的地方是什么呢,下面是代码:
void test(int &a) {
a += 3;
cout << “a的值:” << a << “\n”
<< “a的地址:” << &a << “\n”;
}
void main()
{
int b = 10;
test(b);
cout << “b的值:” << b << “\n”
<< “b的地址:” << &b << “\n”;
}
在代码上是不是发现和值传递差不多,只是参数声明哪里比值传递的多了一个&符号其他的和值传递一样,但是就是在参数声明哪里多一个&符号,它就不是值传递,它的传递方式和值传递的是完全不一样的,所以在写参数声明时,要注意不要在你需要的引用传递时漏了一个&符号,它们的不同之处在哪里呢,我们看输出结果就知道了,下面是结果:
C++ 参数的三种传递方式和应用参加

 可以发现的是a的值和b的值是一样的,上面我们说指针传递时,是输出了一个a所指向地址的值,它的值和b的值是一样,那么引用是不是和指针一样传的地址呢,其实不是的因为引用传递其实是等于把b作为test()函数的全局变量,为什么这样说呢,是因为a的地址和b相同,然后a所做的所有操作都等于b做的,这a像是b的什么呢,这是名字不同,其他一样,a其实就是b的一个别名,所以test()函数对a的所有操作,都等于对b进行,而a只是b的另外一个标识。
那么有人对引用传递还有疑惑对吧,&在参数处是引用在所有非参数声明处都是获取某个变量的地址。还有就是引用可不可以解地址对吧,其实是不可以的,我们可以看一下它如果对引用解地址的话会报什么错误。下面错误提示
C++ 参数的三种传递方式和应用参加

它提示的*(解址符)的操作数必须是指针,意思只能对指针进行解址,对其他的类型是不能解址的。

总结:

然后我们总结一下值传递、指针传递和引用传递不同的地方,首先它们都是可以把值传递给函数的只不过是传递的方式不同,有一点是可以很明显的,指针传递和引用传递都会改变b的值,值传递不会,这就是值传递和另外的区别,而指针传递和引用传递的不同的地方则是指针传递的是b的地址,而引用传递则等于给b起了一个别名,然后通过别名来操作b的值,和它所在的内存地址。

总而言之

值传递:形参开辟内存空间,与形参不同的地址,不能改变值。(变量名的访问)

地址传递:形参不开辟内存空间,与形参相同的地址,能改变值。(地址的访问)

引用传递:形参开辟内存空间,与形参相同的地址,能改变值。文章来源地址https://www.toymoban.com/news/detail-475543.html

 

到了这里,关于C++ 参数的三种传递方式和应用参加的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 为Java应用创建Docker镜像的三种方式

    在 Dockerfiles 出现的很久之前,Java 开发者大多使用单体应用方式部署(WARs, JARs, EARs, 等等)。现在如你所知,最好的做法是为每个小业务单独部署的微服务方式。你构建的不是一个巨大的单体应用程序,而是使多个可以独立运行的小服务。 这正是 Docker 的用武之地。如果你想

    2023年04月26日
    浏览(53)
  • 【C++的奇迹之旅(二)】C++关键字&&命名空间使用的三种方式&&C++输入&输出&&命名空间std的使用惯例

    C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式 等。熟悉C语言之后,对C++学习有一定的帮助,本章节主要目标: 补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用 域方面、IO方面、函数方面、

    2024年04月09日
    浏览(88)
  • OpenCV函数应用:基于二值图像的三种孔洞填充方法记录(附python,C++代码)

    函数系列: OpenCV函数简记_第一章数字图像的基本概念(邻域,连通,色彩空间) OpenCV函数简记_第二章数字图像的基本操作(图像读写,图像像素获取,图像ROI获取,图像混合,图形绘制) OpenCV函数简记_第三章数字图像的滤波处理(方框,均值,高斯,中值和双边滤波) OpenC

    2024年02月05日
    浏览(54)
  • JavaScript的三种引用方式

    1.1、标签引用(或嵌入式) 使用 script 标签将 JavaScript 代码嵌入到 HTML 页面中。可以放置在 head 或 body 中。 显示效果: 1.2、 文件引用 (外链式) 将 JavaScript 代码编写在一个独立的 .js 文件中,并通过 script 标签的 src 属性引入到 HTML 页面中。 显示效果: 1.3、行内式 直接在

    2024年02月02日
    浏览(49)
  • 线程创建的三种方式

    目录 1. Thread类 2. Runnable接口 3. Callable接口 4. 线程的生命周期 新建  就绪 运行 阻塞 等待 结束 继承Thread类的方式创建线程 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务 创建Thread类的子类,即创建了线程对象 调用线程对象的

    2024年02月09日
    浏览(44)
  • Debezium的三种部署方式

    debezium 有下面三种部署方式,其中最常用的就是 kafka connect。 kafka connect 一般情况下,我们通过 kafka connect 来部署 debezium,kafka connect 是一个框架和运行时: source connectors:像 debezium 这样将记录发送到 kafka 的source connector sink connectors:将记录从 kafka topic传播到其他系统的 sin

    2024年02月10日
    浏览(44)
  • 单点登录的三种方式

    因为一个项目种有多个服务组成,每个服务都是独立的,如果登录的时候在一个服务种,那么其他的服务是显示不了的,所以就有了单点登录。 所谓单点登录就是一处登录,处处登录。 第一种方式:session广播机制实现 第一种当时的的原理是session的复制,就是在多个服务中

    2024年02月15日
    浏览(50)
  • 验证合约的三种方式

    使用truffle插件: https://github.com/rkalis/truffle-plugin-verify truffle run verify 合约名称@合约地址 --network 网络名称 --debug 注意:需要开启VPN,然后给CMD也设置代理,否则CMD无法访问外网会验证失败 (每次新开CMD都要执行) 在etherscan上手动上传 1、合约文件如果有导入的外部合约,需

    2023年04月22日
    浏览(56)
  • 解决NPE的三种方式

    NullPointerException(空指针异常,NPE)是Java编程中常见的错误。解决NPE的方法可以从以下三个方面考虑: 明确处理空引用情况: 在某些情况下,无法避免使用可能为空的引用对象。此时,需要明确处理空引用情况,以避免抛出NPE。可以使用条件判断,例如使用if-else语句或者三

    2024年02月22日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包