C++ 值传递、引用传递、指针传递

news2025/7/13 2:43:15

一、简介

参数传递的三种方式:值传递、引用传递、指针传递

二、举例如下


#if 1   值传递   引用传递  指针传递的区别

	void value_input(int a)
	{
		cout << "值传递------函数" <<&a <<endl;
		a = 100;
	}

	void Pointer_input(int * n)
	{
		cout << "指针传递------函数" << n << endl;
		*n = 101;
	}
	// 引用传递
	void  Othername_Input(int &n)
	{
		cout << "引用传递------函数" <<&n << endl;
		n = 1001;
	}
	int main()
	{
		int a = 10;
		cout << "实参的地址------" << &a << endl;
		cout << "=====================------"  << endl;
		value_input(a);
		cout << "值传递------" << a <<"    地址是: "<<&a << endl;  // a 的值不会改变

		cout << "=====================------" << endl;
		Pointer_input(&a);
		cout << "指针传递------" << a << "    地址是: " << &a << endl;  // a 的值会改变

		cout << "=====================------" << endl;
		Othername_Input(a);
		cout << "引用传递------" << a << "    地址是: " << &a << endl;  // a 的值会改变
		return  0;
	}

 

 如上测试:我们可以看出

1、值传递并不会改变实参的地址,而是在形参中有一个新的地址,因此在函数中改变这个值,main 函数中的实参是不会发生改变的。

2、引用和指针传递都是在函数中拿到了main 函数中的实参的地址,然后改变实参中的值

C++ 值传递、指针传递、引用传递详解 - Geek_Ling - 博客园

三、参数传递的本质

1、值传递的本质是将实参的值复制给形参,地址是不同的。

2、引用传递 被调用的形参虽然也作为局部变量在栈中开辟了空间,但是这个时候存放的是有住函数放进来的实参变量的地址,当被调用的时候直都处理成间接寻址(通过栈中存放的地址来访问主函数的实参变量)

3、与引用传递不同的是,虽然都是在被调用函数栈空间上开辟了空间,但是引用采用的是间接寻址法找到主函数中的实参,而指针传递,如果改变被调函数中的指针地址,将不影响主掉函数的相关变量,如果想通过指针参数来改变主调函数中的相关变量,那就要用二级指针或者指针引用。

四、指针传递和引用传递的区别与优劣

引用:

创建的时候必须初始化

 不能用NULL做引用

一旦这个引用被初始化就不能改变引用的关系:程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变其指向的对象(指针变量中的值可以改),而引用对象则不能修改。

		// 有两个对象 pt1和p
		Point pt1(10,10);
		Point p(11, 11);
		Point& pt2 = pt1;  // 也就是说 pt1 这快空间的别名就是 pt2, pt1和pt2 指的是同一个对象  可以理解为messi 有一个小名--》梅老板  
		Point& pt3 = pt1;  // 也就是说 pt1 这快空间的别名就是 pt2, pt1和pt2 指的是同一个对象   messi 还有另一个外号-》小跳蚤
		
		cout << "实参------" << &pt1 << endl;
		cout << "引用2------" << &pt2 << endl;
		//&pt2 = p;  // 这是不能允许的:通俗理解就是,  梅老板同时指向的是两个不同的对象,这个计算在调用的时候就不知道调用的是那个也就是我们常说的二义性




		pt1.x = 12;  //  梅西7夺金球奖
		pt1.y = 15;

		cout << "x------" << pt2.x  << endl;  // 12     梅老板 也7夺金球奖     因为是messi对象
		cout << "y------" << pt2.y << endl;   //15     小跳蚤 也7夺金球奖      因为是messi对象

指针传递和引用传递一般适用于

函数内部修改参数并且希望改动影响调用者。对比指针/引用传递可以将改变由形参“传给”实参(实际上就是直接在实参的内存上修改,

不像值传递将实参的值拷贝到另外的内存地址中才修改)。

另外一种用法是:当一个函数实际需要返回多个值,而只能显式返回一个值时,可以将另外需要返回的变量以指针/引用传递

给函数,这样在函数内部修改并且返回后,调用者可以拿到被修改过后的变量,也相当于一个隐式的返回值传递吧。

指针和引用的异同点:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/36587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云上办公兴起,华为云桌面Workspace更靠谱

云上办公兴起&#xff0c;华为云桌面Workspace更靠谱 为了办公的便利性&#xff0c;也趁着华为云推行“实惠更实用&#xff0c;11都如愿”的主题活动&#xff0c;许多企业果断入手了华为云桌面Workspace服务&#xff0c;当亲自试用后&#xff0c;才逐渐感受使用华为云桌面Work…

FPGA+ARM异核架构,基于米尔MYC-JX8MMA7核心板的全自动血细胞分析仪

全自动血细胞分析仪是医院临床检验应用非常广泛的仪器之一&#xff0c;用来检测红细胞、血红蛋白、白细胞、血小板等项目。是基于电子技术和自动化技术的全自动智能设备&#xff0c;功能齐全&#xff0c;操作简单&#xff0c;依托相关计算机系统在数据处理和数据分析等方面具有…

脚气、灰指甲治疗实验方案

脚气 &#xff08;已临床实验&#xff09; 脚气&#xff0c;又叫足廯、香港脚。 糜烂性脚气 症状&#xff1a;80%都是这种类型。常见于多汗人群。角质层被汗水浸软&#xff0c;发白了以后&#xff0c;走动不断摩擦表皮脱落&#xff0c;露出鲜红色糜烂面&#xff0c;瘙痒剧烈&…

什么是分布式软件系统

:什么是分布式软件系统&#xff1f;分布式软件系统是什么意思&#xff1f; 分布式软件系统(Distributed Software Systems)是支持分布式处理的软件系统,是在由通信网络互联的多处理机体系结构上执行任务的系统。它包括分布式操作系统、分布式程序设计语言及其编译(解释)系统、分…

[附源码]java毕业设计疫情状况下生活物资集体团购系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[毕业设计]大数据电影数据分析可视化

目录 前言 课题背景和意义 实现技术思路 网页分析 索引页 详情页 反爬破解 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,…

Unity UI 框架相关的一些思考

开源地址&#xff1a; GitHub - NRatel/NRFramework.UI: 基于 Unity UGUI 的 UI 开发框架基于 Unity UGUI 的 UI 开发框架. Contribute to NRatel/NRFramework.UI development by creating an account on GitHub.https://github.com/NRatel/NRFramework.UI 简介&#xff1a;…

EMR-StarRocks 与 Flink 在汇量实时写入场景的最佳实践

作者&#xff1a; 刘腾飞 汇量后端开发工程师 阿里云开源OLAP研发团队 EMR-StarRocks介绍 阿里云EMR在年初推出了StarRocks服务&#xff0c;StarRocks是新一代极速全场景MPP&#xff08;Massively Parallel Processing&#xff09;数据仓库&#xff0c;致力于构建极速和统一分…

帝国cms后台登录系统限制次数,60分钟过后重新登录解决办法

帝国cms后台登录系统一不小心登录频繁就提示: 系统限制的登录次数不得超过5次,请等60分钟过后,方可重新登录 主要原因就是频繁的输错用户名或者密码导致登录受限 解帝国cms后台登录系统限制次数方法一:等待60分钟,然后再尝试登录 解帝国cms后台登录系统限制次数方法二:修改…

Hive之DQL操作

Hive系列第六章 &#xff08;实际是第七篇&#xff0c;就不改目录序号了&#xff0c;大家知道就行&#xff0c;后续的篇章类推即可&#xff09; 第六章 DQL查询数据 DDL&#xff1a; Data Definition Language 数据定义语言 DML&#xff1a; Data Manipulation Language …

【科学文献计量】GC.networkCoInvestigator()和GC.networkCoInvestigator()中的参数解释

@TOC 1 数据 使用官网提供的基金数据导入到python环境中 2 GC.networkCoInvestigator()中的参数解释 GC.networkCoInvestigator()中的参数解释: targetTagsL: [list]数据类型。默认为None,可以指定为Grant中研究者的标签构成的列表,很多基金中作者没有已知的标签,需要自…

最新版本EasyRecovery15个人免费版电脑数据恢复工具

最新版本EasyRecovery15是一款是款恢复率高、速度快的数据恢复软件&#xff0c;Ontrack EasyRecovery (易恢复) 跨平台支持 Windows 以及 Mac 系统&#xff0c;能能够顺利找回因各种原因丢失的文件&#xff0c;比如文件误删除、误格式化、分区丢失等&#xff0c;且EasyRecovery…

一种获得离散型周期数据的变化周期的算法

400个数据像这样&#xff1a; 152 155 155 237 24 27 27 109 152 155 155 237 24 27 27 109 152 155 155 237 24 27 27 109 152 155 155 237 24 27 27 109 152 155 155 237 24 27 27 109 152 155 155 237 24 27 27 109 152 155 155 237 24 27 27 109 152 155 155 237 24 27 27 …

【Android 开发】 面试官刨根问底?教你如何避免翻车沟通表达能力

很久以前&#xff0c;凭借四大组件、Java基础等知识&#xff0c;便可开开心心的开发&#xff0c;轻松的上岗&#xff1b; 而随着Android的不断发展完善&#xff0c;各种组件库越来越成熟&#xff0c;学习资料越来越多&#xff0c;我们却慢慢的看不到了方向&#xff1b;信息爆炸…

Servlet(Cookie和Session)

目录 &#x1f432; 1. Cookie 的工作流程 &#x1f432; 2. Servlet中操作 Cookie 和 Session 的api &#x1f432; 3. 案例1: 模拟登录 &#x1f432; 4. 上传文件 &#x1f432; 5. 案例2: 上传文件 &#x1f432; 1. Cookie 的工作流程 Cookie 是浏览器在本地持久化保…

[附源码]SSM计算机毕业设计朋辈帮扶系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[毕业设计]opencv机器学习双目测距精度测量系统

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投…

Flutter高仿微信-第43篇-群聊列表

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 实现代码&#xff1a; /*** Author : wangning* Email : maoning20080809163.c…

泰克Tektronix 信号发生器AFG31022 ,2频道,25MHz

AFG31022 泰克函数发生器 AFG31022 是 Tektronix 的 25 MHz 函数发生器。 产品特征&#xff1a; 2个频道 25 MHz 正弦波 输出幅度范围&#xff1a;1 mVP-P 至 10 VP-P&#xff0c;50 Ω 负载 14 位垂直分辨率 内置波形包括正弦波、方波、斜波、脉冲、噪声和其他常用波形…

数据库设计规范

一、概述 系统数据库表的设计如果有问题&#xff0c;可能造成数据冗余、信息重复、存储空间浪费、数据插入更新异常等。设计一个好的数据表可尽量避免上述问题的发生&#xff0c;如何设计一个好的数据库是有一定的规范的。而这些设计表的基本原则规范称为范式 二、范式 1、范…