【C++】C++ 引用详解 ③ ( 函数返回值不能是 “ 局部变量 “ 的引用或指针 | 函数内的 “ 局部变量 “ 的引用或指针做函数返回值无意义 )

news2024/12/25 22:10:50

文章目录

  • 一、函数返回值不能是 " 局部变量 " 的引用或指针
    • 1、引用通常做右值
    • 2、函数返回值特点
    • 3、函数内的 " 局部变量 " 的引用或指针做函数返回值无意义
  • 二、代码示例 - " 局部变量 " 引用或指针做函数返回值测试





一、函数返回值不能是 " 局部变量 " 的引用或指针




1、引用通常做右值


之前使用 引用 时 , 都是作为 右值 使用 , 引用只在 声明 的 同时 进行初始化时 , 才作为左值 ,

// 定义变量 a
int a = 10;

// 定义变量 a 的引用 b
int& b = a;

引用 声明 并 初始化 之后 , 就没有当过右值 , 这是因为 引用 的本质 是 指针常量 , 其本身不可被更改 ;


2、函数返回值特点


函数 的 返回值 几乎很少是 引用 或 指针 ;

函数 的 计算结果 经常是借用 参数中的 地址 / 引用 进行返回的 ,
函数 的 返回值 一般返回一个 int 类型的值 , 如果 int 为 0 就是成功 , int 为其它数值 , 就是错误码 ;


3、函数内的 " 局部变量 " 的引用或指针做函数返回值无意义


如果 想要 使用 引用 或 指针 作 函数的计算结果 , 一般都是将 引用 和 指针 作为 传入的 参数 ;

在 main 函数中 , 调用 函数 , 创建一个 变量 , 将 变量 的 地址 / 引用 传入 函数 , 在函数中通过 指针符号 或者 引用 , 直接修改传入的实参 , 也就是 修改 地址 / 引用 指向的 内存中的数据 , 该操作可以修改 外部 main 函数中的变量值 ;


如果 想要 在 函数 中 , 返回一个 地址 / 引用 作为返回值 ,

这个 地址 / 引用 是 谁的 ,

  • 如果 是 在 函数内部 栈内存 中创建的 变量的 地址 / 引用 , 那么 函数执行结束 , 返回时 , 该 栈内存直接被回收了 , 地址 / 引用 指向的内存空间可能就是随机值 ;
  • 如果 是 外部的 main 函数中的 变量 的 地址 / 引用 , 那么 肯定是从 参数中 传入的 , 那么这个 地址 / 引用 就不需要返回 , 函数内部修改 , 直接体现在了外部的变量中 ;

因此 , 返回 局部变量 的 地址 / 引用 是无意义的 ,

一般 函数 只 返回一个 int 值 , 表示 该函数 是否执行成功 , 如果执行失败 , 返回错误码 ( 在哪一步执行失败 ) ;


如果 想要 在 函数中 , 返回 引用 / 指针 , 函数局部变量的 引用 / 指针 是返回不出来的 ,

即使强行返回 引用 / 指针 , 也是当前 局部变量 被 分配的 栈内存 地址 ,

该函数 执行完毕后 , 该 函数对应的 栈内存 会被回收 , 相应的 局不变量 地址 也有没有了意义 ,

此时 , 再持有一个没有意义的 引用 / 指针 , 取出的值是随机无意义的值 ;





二、代码示例 - " 局部变量 " 引用或指针做函数返回值测试



下面的 int& getNum2() 函数 , 返回一个引用 , 该 引用 是 局部变量 的引用 ;

下面的 int* getNum3() 函数 , 返回一个指针 , 该 指针 是 局部变量 的指针 ;

上述两个函数是无意义的 , 获取到 函数 返回的 " 局部变量 " 的 引用 或 指针 , 然后获取地址 , 发现获取的都是随机值 , 都是无意义的值 ;

num21 = -858993460 , *num3 = -858993460

代码示例 :

// 包含 C++ 头文件
#include "iostream"

// 使用 std 标准命名空间
//		该命名空间中 , 定义了很多标准定义
using namespace std;

// 导入 C 头文件
#include <stdio.h>

// 返回值是普通变量
int getNum()
{
	int num = 10;
	return num;
}

// 返回值是引用
int& getNum2()
{
	// 此处的 num 是临时变量
	// 该临时变量占用的 栈内存 空间 
	// 在函数执行完毕后 , 会被回收 , 失效
	int num = 20;
	int& a = num;
	return a;
}

// 返回值是指针类型
int* getNum3()
{
	int num = 30;
	return &num;
}

int main()
{
	// 函数返回 int 类型变量 赋值给 int 类型变量 num1
	int num1 = getNum();

	// 函数返回 int 类型引用
	// 将 引用 赋值给 num2 变量
	// 此处 使用 变量 接收引用值 , 
	// 会自动将引用值对应的内存数据 10 取出来 , 赋值给变量
	int num2 = getNum2();

	// 将 int 类型引用 赋值给 num21 int 类型引用
	// 这里只能记录地址 , 没有将值取出来保存
	// 该地址马上就要被其它数据覆盖了
	int& num21 = getNum2();

	// 将 返回的 指针赋值给 int 类型指针
	// 这里只能记录地址 , 没有将值取出来保存
	// 该地址马上就要被其它数据覆盖了
	int* num3 = getNum3();

	// 再次调用一次 , 覆盖被回收的栈内存数据
	// 这一步主要是混淆栈内存 , 使栈内存混乱
	int num4 = getNum();

	// 打印计算结果
	printf("num1 = %d , num2 = %d , num21 = %d , *num3 = %d , num4 = %d \n", num1, num2, num21, *num3 , num4);


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
    return 0;
}

执行结果 :

num1 = 10 , num2 = 20 , num21 = -858993460 , *num3 = -858993460 , num4 = 10
Press any key to continue . . .

在这里插入图片描述

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

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

相关文章

为什么要使用IP地址进行定位

IP地址定位是一种以互联网协议地址&#xff08;IP地址&#xff09;为基础的技术&#xff0c;它能够准确地确定一个设备在互联网上的位置。这种技术的应用范围非常广泛&#xff0c;从个人用户到企业机构甚至是国家安全和网络安全等领域都需要使用IP地址定位。 首先&#xff0c;I…

uniapp接入广告的问题总结

Uniapp官方解决方案 uni-app 支持接入uni-ad广告联盟&#xff0c;开发者可实现一次开发&#xff0c;多端变现。 uni-ad 支持开屏、信息流、激励视频、视频流、悬浮红包、推送等丰富的广告形式&#xff1b; uni-ad 聚合了全网所有主流广告源&#xff0c;包括腾讯优量汇、字节…

MIA文献阅读 ——医学图像处理在慢性肾脏疾病评估中的最新进展【2021】

目录 0 摘要1 引言2 磁共振成像(MRI)2.1 扩散磁共振成像2.1.1 扩散加权成像(DWI)2.1.2 扩散张量成像(DTI) 2.2 血氧水平依赖成像2.3 动脉自旋标记2.4 动态对比增强磁共振成像2.5 T1和T2映射2.6 磁化转移磁共振成像2.7 磁共振弹性成像2.8 其他磁共振成像技术 3 其他成像方式3.1 …

学习记录——FeatEnHancer

FeatEnHancer: Enhancing Hierarchical Features for Object Detection and Beyond Under Low-Light Vision 一种适用于任意低光照任务增强方法 ICCV 2023 提出了FeatEnHancer&#xff0c;一种用于低光照视觉任务的增强型多尺度层次特征的新方法。提议的解决方案重点增强相关特…

HHDESK实用工具新增

1 Ping测试 此功能可以很方便的测试&#xff0c;与需要连接的IP间是否畅通。 首页点击工具——网络——ping测试&#xff1b; 弹出对话框&#xff0c;在框内填写需要连接的IP&#xff0c;点击搜索即可。 2 Port测试 本功能用以测试连接IP的特定端口是否畅通。 首页——…

Android App的设计规范

Android App 设计规范是为开发者和设计师提供的一系列准则和建议&#xff0c;以确保应用在 Android 设备上的外观、交互和用户体验保持一致。以下是一些常见的 Android App 设计规范要点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开…

leetcode739. 每日温度 单调栈

自己思路&#xff1a; 想到用两个栈&#xff0c;一个维护元素、另一个维护下标。但是还是无法处理有重复元素的问题&#xff08;用哈希表来存储的时候&#xff09;。所以就看了答案的思路。 答案思路&#xff1a; 从前往后遍历&#xff0c;维护一个单调栈。栈存放数组的下标。…

5G NR:RACH流程-- Msg1之生成PRACH Preamble

随机接入流程中的Msg1&#xff0c;即在PRACH信道上发送random access preamble。涉及到两个问题&#xff1a; 一个是如何产生preamble&#xff1f;一个是如何选择正确的PRACH时频资源发送所选的preamble? 一、PRACH Preamble是什么 PRACH Preamble从数学上来讲是一个长度为…

springboot定时任务:同时使用定时任务和websocket报错

背景 项目使用了websocket,实现了消息的实时推送。后来项目需要一个定时任务&#xff0c;使用org.springframework.scheduling.annotation的EnableScheduling注解来实现&#xff0c;启动项目之后报错 Bean com.alibaba.cloud.sentinel.custom.SentinelAutoConfiguration of t…

MySQL 字符集概念与原理及如何配置字符集 - 超详细图文详解

目录 一、字符集概念 1、字符&#xff08;Character&#xff09; 2、字符编码 3、字符集&#xff08;Character set&#xff09; 二、字符集原理 1、ASCII字符集 2、GB2312 3、GBK 4、GB18030 5、BIG5 6、Unicode 编码 三、字符序 四、MySQL字符集 & 字符序 …

W5100S-EVB-PICO进行UDP组播数据回环测试(九)

前言 上一章我们用我们的开发板作为UDP客户端连接服务器进行数据回环测试&#xff0c;那么本章我们进行UDP组播数据回环测试。 什么是UDP组播&#xff1f; 组播是主机间一对多的通讯模式&#xff0c; 组播是一种允许一个或多个组播源发送同一报文到多个接收者的技术。组播源将…

【ArcGIS Pro二次开发】(62):复制字段

应网友需求&#xff0c;做了这么一个复制字段的小工具。 假定这样一个场景&#xff0c;手头有一个要素1&#xff0c;要素里有10个字段&#xff0c;另一个要素2&#xff0c;除了shape_area等图形字段外&#xff0c;没有其它字段。 现在的需求是&#xff0c;想把要素1中的8个字…

细说百数商务模式为什么是中小企业在低代码行业创业的最优选

低代码作为软件开发工具之一&#xff0c;可覆盖制造业、金融、医疗、房地产、零售、餐饮、航空等众多行业的不同应用场景。百数低代码作为一款一站式企业协同平台&#xff0c;深耕办公领域10余年&#xff0c;为企业信息化发展提供系统化、流程化、智能化的解决方案。 百数服务…

Android ---使用Jenkins 打包release版本不能安装或者安装后不显示APP

大家在用 Jenkins的时候&#xff0c;是不是会觉得很爽&#xff0c;因为他在用的过程中&#xff0c;是无脑的&#xff0c;毕竟一键触发&#xff01;&#xff01;&#xff01;&#xff01; 这边记录一个昨天&#xff0c;今天遇到的一个坑货问题&#xff0c;别人提交了所有代码&am…

如何理解P值?

为了更好地理解p值、显著性水平、置信水平的概念&#xff0c;先看一个例子&#xff1a; 小明和小红聚餐时打赌&#xff0c;小明说 下一把骰子掷出的数值一定大于1&#xff0c;谁输了谁买单。小红盘算着要不要和小明打赌&#xff1a; 原假设H0&#xff1a;值1&#xff1b;备择…

高等数学(上)【基础学科、极限部分】

学习【高等数学&#xff08;上&#xff09;】6小时从0基础直追满绩&#xff01;_哔哩哔哩_bilibili 高数基础 高等数学无非分为三个部分&#xff1a;极限、导数&#xff08;微分&#xff09;和积分——构成了微积分 高等数学学的就是 微积分&#xff0c;整体其实只是一个思想 …

C++:编译与链接

首先要思考问什么要编译与链接&#xff0c;首先这是一个如何把源程序即写好的代码编程可执行文件的过程&#xff0c;简单的加工模型如下图&#xff1a; 这是一个简单的加工模型&#xff0c;比较直观&#xff0c;但是有一个问题&#xff0c;就是如果对源程序进行修改&#xff0c…

学习python可以做什么?有前景么

Python被热门领域广泛应用 学习者就业优势明显&#xff01; 说到Python的优势&#xff0c;就不得不提这句玩笑话&#xff1a;Python除了不会生孩子&#xff0c;其他的都会。 Web开发、网络爬虫、数据分析、人工智能、自动化、云计算、网络编程、游戏开发等领域&#xff0c;统…

Cent OS 中各个文件夹功能

目录 一、根目录简述 二、目录详细分级说明 &#xff08;一&#xff09;bin &#xff08;二&#xff09;sbin &#xff08;三&#xff09;lib &#xff08;四&#xff09;etc &#xff08;五&#xff09;dev &#xff08;六&#xff09;usr &#xff08;七&#xff09…

Spring与Mybatis整合aop整合pageHelper分页插件

前言 Spring与MyBatis整合的意义在于提供了一种结合优势的方式&#xff0c;以便更好地开发和管理持久层&#xff08;数据库访问&#xff09;代码。 这里也是总结了几点主要意义 简化配置&#xff1a;Spring与MyBatis整合后&#xff0c;可以通过Spring的配置文件来管理和配置M…