C++基础语法:引用的补充

前言

        上一篇帖子讲了引用,文章地址C++语法基础:引用&-CSDN博客

        对一些细节做补充,上一篇的内容基本上已经够用了,这篇从使用者的角度深入分析引用.

引用和指针的关系

        稍后有证明,引用既不是变量,也不是指针,他是介于"变量"和"指针"之间的数据类型

        指针的特征是:间接访问和修改指向的数据

        引用和指针的使用范围不同:

                指针可以指向单个数据,数组,结点.

                引用不能指向数组,可以指向单个数据(但不推荐),主要用来指向类对象

        他们互相可以赋值吗?写两行代码试试

	// 指针和引用之间的关系
    int b=0;
    int &b_pref=b;                      //声明引用
	int* bp=&b ;						//声明指针
//	b_pref = bp;						//指针赋给引用,错误提示
	*bp = b_pref;						//引用赋给变量,可以

        ----结果指针不能赋值引用,引用在使用时被当成变量.

返回引用

        补充说明返回引用的函数定义

         先回顾返回指针的条件:返回的指针可以是new产生的指针传入的指针

#include<iostream>
using namespace std;

int* ret_pointer_demo1(int* demo);
int* ret_pointer_demo2();

int main(void) {
	int a = 100;
	int* p = &a;
	cout << "传入指针处理前的a=" << *p << endl;
	p=ret_pointer_demo1(p);				//接收的指针和传入相同
	cout << "传入指针处理后的a=" << *p << endl;

	int* pa = ret_pointer_demo2();		//声明指针接收动态分配内存的指针
	cout << "数组里的第一个数字是:"<<pa[0] << endl;	
}

int* ret_pointer_demo1(int* demo) {		//返回传入的指针
	*demo = *demo + 10;
	return demo;						//注意:传入demo,返回demo
}

int* ret_pointer_demo2() {				//返回动态分配内存的指针
	int* p = new int[2]{ 10,20 };
	return p;							//注意:返回new产生的指针
}

        返回引用的条件与之类似,返回已传入的引用.

#include<iostream>
using namespace std;

int& ret_pref_demo(int& demo);

int main(void) {
	int a = 100;
	int& a_pref = a;					//声明引用
	a_pref=ret_pref_demo(a_pref);		//调用传入引用的函数
	cout << "传入引用处理后的a=" << a_pref << endl;
}

int& ret_pref_demo(int& demo) {			//返回传入的引用
	demo += 100;
	return demo;
}

----说明:返回已传入的引用,是为了方便函数定义,而不是唯一的,必须的定义

        在<C++ Prime Plus> 6th Edition的P268上有个例子,但为了避免太复杂,就不展开了.

===============================内容分割线:小意外============================

下列内容无关引用:

这段代码照理说,局部变量使用后自动被释放,所以*pb打印出来的值应该是不正确的,但奇怪的是没能释放内存,*pb打印出来还是20000.------做记号留待解决

#include<iostream>
using namespace std;

int* ret_pointer_demo3();

int main(void) {

	int* pb = ret_pointer_demo3();		//声明指针接收局部变量指针
	cout << "数组里的第一个数字是:"<< *pb << endl; //没能释放内存
}

int* ret_pointer_demo3() {				//返回局部变量指针
	int ar = 20000;
	int* pt = &ar;
	return pt;							//返回局部变量指针
}

===============================内容分割线:小意外============================

引用的总结

         引用类型到底是什么样的概念呢?他用起来起来似乎和变量没有区别,如下代码所示:

	// 引用类型使用的时候等同于变量
    //证明1:引用可赋值给变量
    int b=0;
    int &b_pref=b;                  //声明引用
    int c=b_pref;                   //引用类型数据可以赋值给变量

	int* bp=&b ;					//声明指针
	*bp = b_pref;					//引用类型数据可以赋值给变量
    
    //证明2:引用类型做函数形参,返回引用类型
    int& ret_pref_demo(int& demo) {	//形参和返回值是引用类型
	demo += 100;
	return demo;						
    }
    //传参和接收返回值时,两者通用
    b_pref=ret_pref_demo(b_pref);   //传入引用,引用接收引用
    b_pref=ret_pref_demo(c);        //传入变量,引用接收引用
    c=ret_pref_demo(b_pref);        //传入引用,变量接收引用
    c=ret_pref_demo(c);             //传入变量,变量接收引用
    
    

        然而还是从这个函数定义里,我们发现引用起到了指针的作用

    //证明:引用类型在函数内部,起得是指针作用
    int& ret_pref_demo(int& demo) {	//引用做形参,传入的是数据地址,而非数据副本
	demo += 100;                    //引用像指针一样间接访问数据,可修改原始数据
	return demo;			        //返回指针类型,必须返回传入指针
                                    //返回引用类型(int &),必须返回传入引用	(demo)		
    }

        所以得出结论,引用在使用时候等同于变量,在函数中等同于指针.

         根据得出的结论,你可以这样做:

                                        1)在声明和使用引用时,放心定义放心用,因为他就是变量;

                                        2)在用引用类型做形参时,注意他是指针

其他

        当对引用类型分析透彻后,又一次证明了C++语法有些繁琐.学习C++需要耐心

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLM-Transformer:经典与前沿方法详解

LLM-Transformer&#xff1a;经典与前沿方法详解 前言 大规模语言模型&#xff08;LLM&#xff09;是当前自然语言处理&#xff08;NLP&#xff09;领域的核心技术&#xff0c;而Transformer架构作为LLM的基础&#xff0c;极大地推动了这一领域的发展。本文将详细介绍LLM-Tra…

DP:子序列问题

文章目录 什么是子序列子序列的特点举例说明常见问题 关于子序列问题的几个例题1.最长递增子序列2.摆动序列3.最长递增子序列的个数4.最长数对链5.最长定差子序列 总结 什么是子序列 在计算机科学和数学中&#xff0c;子序列&#xff08;Subsequence&#xff09;是指从一个序列…

【2024德国签证】去德国读博士需要申请什么签证?

德国留学签证面签的经过及注意事项 ✨&#xff01;希望我的经验可以帮助大家顺利通过签证&#xff0c;顺利开启德国留学之旅 。记得带上足够的现金和材料哦 &#xff01; 一、选择适合自己的签证类型 在选择签证类型时&#xff0c;一定要根据自己的实际情况来选择合适的签证种…

Wp-scan一键扫描wordpress网页(KALI工具系列三十二)

目录 1、KALI LINUX 简介 2、Wp-scan工具简介 3、信息收集 3.1 目标IP&#xff08;服务器) 3.2kali的IP 4、操作实例 4.1 基本扫描 4.2 扫描已知漏洞 4.3 扫描目标主题 4.4 列出用户 4.5 输出扫描文件 4.6 输出详细结果 5、总结 1、KALI LINUX 简介 Kali Linux 是一…

JAVA极简图书管理系统,初识springboot后端项目

前提条件&#xff1a; 具备基础的springboot 知识 Java基础 废话不多说&#xff01; 创建项目 配置所需环境 将application.properties>application.yml 配置以下环境 数据库连接MySQL 自己创建的数据库名称为book_test server:port: 8080 spring:datasource:url:…

存储故障导致Oracle 19c 数据文件处于recover状态的恢复案例

1.背景 某次平台分布式存储故障&#xff0c;导致数据库出现ORA-00376、ORA-01110数据文件不可读报错&#xff0c;本文将整个恢复过程进行整理记录。 2.报错信息 在进行租户数据库打开操作时&#xff0c;出现了如下报错&#xff1a; ORA-00376: file 17 cannot be read at t…

DICOM灰度图像、彩色图像的窗宽、窗位与像素的最大最小值的换算关系?

图像可以调整窗宽、窗位 dicom图像中灰度图像可以调整窗宽、窗位&#xff0c;RGB图像调整亮度或对比度&#xff1f;_灰度 图 调节窗宽-CSDN博客 窗宽、窗位与像素的最大最小值的换算关系? 换算公式 max-minWindowWidth; (maxmin)/2WindowCenter; 详细解释 窗宽&#xff0…

谷歌重磅:告别RAG,长上下文的大语言模型无需检索增强

当今人工智能领域正在经历一场静默的革命。随着大语言模型(LLM)的快速发展&#xff0c;它们不仅能够处理更长的上下文&#xff0c;还展现出惊人的推理和检索能力。 难道我们要告别基于LLM的检索增强生成(RAG)了吗&#xff1f; 结果还真是这样&#xff0c;最近谷歌发布专门用于…

贪心算法算法,完全零基础小白教程,不是计算机的都能学会!超详解

目录 一、基本概念 二、举几个例子&#xff0c;便于理解 1、找零问题 2、最小路径和 3、背包问题 1&#xff09;只考虑体积的贪心策略&#xff1a; 2&#xff09; 只考虑价值的贪心策略&#xff1a; 三、贪心策略的特点 四、贪心策略证明 四、如何学习贪心 五、例题…

eNSP中WLAN的配置和使用

一、基础配置 1.拓扑图 2.VLAN和IP配置 a.R1 <Huawei>system-view [Huawei]sysname R1 GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0]ip address 200.200.200.200 24 b.S1 <Huawei>system-view [Huawei]sysname S1 [S1]vlan 100 [S1-vlan100]vlan 1…

IAR工程目录移动报错(改变文件目录结构)

刚开始用IAR&#xff0c;记录一下。 工作中使用华大单片机&#xff0c;例程的文件目录结构太复杂了想精简一点。 1.如果原本的C文件相对工程文件&#xff08;.eww文件&#xff09;路径变化了&#xff0c;需要先打开工程&#xff0c;再将所有的.c文件右键Add添加进工程&#xf…

PHP7源码结构

PHP7程序的执行过程 1.PHP代码经过词法分析转换为有意义的Token&#xff1b; 2.Token经过语法分析生成AST&#xff08;Abstract Synstract Syntax Tree&#xff0c;抽象语法树&#xff09;&#xff1b; 3.AST生成对应的opcode&#xff0c;被虚拟机执行。 源码结构&#xff1…

昇思25天学习打卡营第14天|CycleGAN图像风格迁移互换

模型介绍 模型简介 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;该模型实现了一种在没有配对示例的情况下学习将图像从源域 X 转换到目标域 Y 的方法。 该模型一个重要应用领域是域迁移&#xff0c;它只需要两种域的数据&#xff0c;而不…

2023-2024华为ICT大赛中国区 实践赛网络赛道 全国总决赛 理论部分真题

Part1 数通模块(10题)&#xff1a; 1、如图所示&#xff0c;某园区部署了IPv6进行业务测试&#xff0c;该网络中有4台路由器&#xff0c;运行OSPFv3实现网络的互联互通&#xff0c;以下关于该OSPFv3网络产生的LSA的描述&#xff0c;错误的是哪一项?(单选题) A.R1的LSDB中将存在…

Java高级重点知识点-13-数据结构、List集合、List集合的子类

文章目录 数据结构List集合List的子类&#xff08;ArrayList集、LinkedList集&#xff09; 数据结构 栈 stack,又称堆栈&#xff0c;它是运算受限的线性表&#xff0c;其限制是仅允许在标的一端进行插入和删除操作&#xff0c;不允许在其他任何位置进行添加、查找、删除等操作…

如何下载huggingface仓库里某一个文件

如何下载huggingface仓库里某一个文件&#xff1a; https://huggingface.co/PixArt-alpha/PixArt-Sigma/tree/main 直接用命令&#xff1a; wget https://huggingface.co/PixArt-alpha/PixArt-Sigma/resolve/main/PixArt-Sigma-XL-2-2K-MS.pth

30个!2024重大科学问题、工程技术难题和产业技术问题发布

【SciencePub学术】中国科协自2018年开始&#xff0c;组织开展重大科技问题难题征集发布活动&#xff0c;引导广大科技工作者紧跟世界科技发展大势&#xff0c;聚焦国家重大需求&#xff0c;开展原创性、引领性研究&#xff0c;不断夯实高质量发展的科技支撑。 自2024年征集活动…

南京林业大学点云相关团队论文

【1】Chen Dong, Wan Lincheng, Hu Fan, Li Jing, Chen Yanming, Shen Yueqian*, Peethambaran Jiju, 2024. Semantic-aware room-level indoor modeling from point clouds, International Journal of Applied Earth Observation and Geoinformation, 2024, 127, 103685. 语义…

QT5 static_cast实现显示类型转换

QT5 static_cast实现显示类型转换&#xff0c;解决信号重载情况

一款十六进制编辑器,你的瑞士军刀!!【送源码】

软件介绍 ImHex是一款功能强大的十六进制编辑器&#xff0c;专为逆向工程师、程序员以及夜间工作的用户设计。它不仅提供了基础的二进制数据编辑功能&#xff0c;还集成了一系列高级特性&#xff0c;使其成为分析和修改二进制文件的理想工具。 功能特点 专为逆向工程、编程和夜…
最新文章