C++引用(&)解析:引用的作用,什么时候使用引用,引用与指针的不同

2023-10-29

引用是什么?

 什么时候使用引用

做函数的参数

做函数的返回值

 引用与指针的不同


引用是什么?

引用是变量的别名,理论上不开辟新的空间。

 &符号,是类型标识符的一部分

被引用的数据类型 + & 变量名称

如下图中,变量a 与变量ra 指向同一块内存空间。

 

由此可知,改变ra 的值,就相当于改变a 的值 

#include<iostream>
using namespace std;

int main() {
	int a = 10;
	int& ra = a;
	cout << "a = " << a << endl;
	cout << "ra= " << ra << endl;
	ra = 20;
	cout << "a = " << a << endl;
	cout << "ra= " << ra << endl;
	
	return 0;
}

注意事项:

引用必须在声明时就赋值。

  //错误示例
    int a = 10;
	int& ra;
	ra = a;

 什么时候使用引用

做函数的参数

同指针一样,改变形参即可改变实参

void Swap(int& num1, int& num2) {
	int tmp = num1;
	num1 = num2;
	num2 = tmp;
}

做函数的返回值

传值返回:计算return 后面表达式的结果,将结果返回给调用函数。该结果被复制到一个临时位置,而程序将使用这个值。当需要返回一个较大的数据时,将会消耗较多空间或时间。

函数计算的结果在函数的栈帧中,当函数结束调用后栈帧会销毁。内存空间被销毁后,空间还在,也可以访问,但是数据不被保护,读写数据都不稳定。(易出现随机值)

引用返回:返回一个临时变量。减少拷贝,提高效率。并且可以修改返回值。

但是使用引用返回会出现一些问题:返回的是数据的别名,但是数据的真实存储已经被销毁了。

#include<iostream>
using namespace std;

int& test() {
	int c = 30;
	int& rc = c;
	return rc;
}

int main() {
	int& ret = test();
	cout << ret << endl;
	cout << ret << endl;
	cout << ret << endl;
	
	return 0;
}

 第一次打印出正确结果是偶然,后面就是随机值了(cout也是函数)

使用引用返回时要注意:

出了作用域,返回变量不存在,就不能用引用返回。因为引用返回的结果是未定义的

出了函数作用域,返回变量存在才可以用引用返回

 const 与引用

在哪些地方使用const + 引用?

引用做参数时参数受限制。

void fnc(const int& x);

在指针和引用赋值中,权限可以缩小,不可以放大。

权限放大的错误示范

修改:

 

 引用与指针的不同

1. 引用概念上定义一个变量的别名,指针存储一个变量地址。

2. 引用在定义时必须初始化,指针没有要求

3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体

4. 没有NULL引用,但有NULL指针

5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节,64 位平台下占8个字节)

6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小 int main() { int a = 10; int& ra = a; cout<<"&a = "<<&a<

7. 有多级指针,但是没有多级引用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++引用(&)解析:引用的作用,什么时候使用引用,引用与指针的不同 的相关文章

随机推荐

  • windows启动Docker失败提示:waiting for docker daemon: context deadline exceeded

    报错提示如下图 解决方法 以管理员方式打开CMD 运行netsh winsock reset 后 重启电脑之后再次启动Docker就可以了 如果还是没有效果可以尝试以下解决方法 检查Docker服务是否已启动 在命令行中输入 service
  • 完美解决eclipse中文注释错位、缩进、被放大BUG

    完美解决eclipse中文注释错位 缩进 被放大BUG 1 常规操作 2 另辟蹊径 2 1 基本思路 字体融合法 2 2 操作步骤 2 2 1 软件准备 2 2 2 文件准备 2 2 3详细步骤 3 写在最后 1 常规操作 这个BUG有大量
  • C++数组

    C 支持数组数据结构 它可以存储一个固定大小的相同类型元素的顺序集合 数组是用来存储一系列数据 但它往往被认为是一系列相同类型的变量 一维数组 一维数组定义的三种方式 1 数据类型 数组名 数组长度 2 数据类型 数组名 数组长度 值1 值
  • 总经理、总裁、总监、首席执行官,谁最了不起?

    总经理 总裁 总监 首席执行官 谁最了不起 中国的 头衔贬值 日趋严重 在中国 近来突然发现身边多了很多只有数名员工的 总裁 或者只管记帐的 财务总监 当然 在中国想要办点儿事 依靠个人的权限与力量是很关键的 因此也造成了这种刻意显示 自己
  • 如何把Eclipse改成中文版

    一 打开浏览器 输入http www eclipse org babel downloads php 如图所示 Babel Language 开头的一栏下面就是各个eclise版本的语言包 此处以Indigo版为例 二 目标锁定 Babel
  • Python 录入学生信息 提示用户在控制台输入3个学生的信息,学生信息包含姓名、年龄

    需求 按照以下要求完成代码的编写 第一步 录入学生信息 1 提示用户在控制台输入3个学生的信息 学生信息包含姓名 年龄 2 要求 封装录入单个学生信息的函数 并返回学生的信息 第二步 展示学生列表信息 1 封装打印学生信息的函数 格式要求如
  • sql sever——创建数据库

    创建数据库 并且指定存储数据库的主数据文件和日志文件 USE master GO CREATE DATABASE BOOK ON PRIMARY 主数据文件组primary NAME book data 主数据文件逻辑文件名 FILENAM
  • 力扣练习题(数组中数据反转)

    力扣练习题 数组中数据反转 要求 int arr 12 23 34 45 56 67 78 89 90 变为 int arr 90 89 78 67 56 45 34 23 12 思路 1 定义一个数组用静态初始化完成元素的初始化 2 循环
  • 剑指 Offer 39. 数组中出现次数超过一半的数字--java解法和心得

    class Solution public int majorityElement int nums 给数组排序 Arrays sort nums 排序后所找的元素比在中间 return nums nums length 2 拓展解法 摩根
  • 线程中断标志位 interrupt()、interrupted()、isInterrupted() 的认识

    常见问题 首先你是怎么去关闭一个开启的线程 调用中断方法之后 线程就立即停止运行吗 带着这两个问题探讨一下 主要围绕着这三个方法讲述 interrupt interrupted isInterrupted 归类为中断 什么是中断标识位 首先
  • 在js中forEach中使用try catch捕获异常

    forEach跳出循环使用try catch 这是我们都知道的 但是今天使用的时候发现出了问题 一 forEach中使用try catch捕获异常 如下图 1 正常情况下try catch是可以捕获到throw里面的内容 并且不会报错 程序
  • 二进制部署K8S

    目录 一 环境准备 1 常见的k8s部署方式 2 关闭防火墙 3 关闭selinux 4 关闭swap 5 根据规划设置主机名 6 在master添加hosts 7 将桥接的IPv4流量传递到iptables的链 8 时间同步 二 部署et
  • wireshark工具使用心得

    抓http包 但是protocal全部为tcp 并且Info也没有解析为http 打开 Edit Preferences 选择Protocals 选择http 在 tcp ports 中加入http端口 抓包数据不完整 清除浏览器缓存 再抓
  • 判断机器IP是公网ip还是内网ip

    首先是恭喜开通blog 对于ip是否是公网ip 网上已经有很多文章进行了描述 但我每次都记不太住 总要查找一下才又清楚 因此决定在这里记录下来 方便以后查询 ip地址分为五类 E类为保留为今后使用 D类为组播地址 用于主机网络地址的就是A类
  • windows套接字I/0模型-IOCP完成端口模型

    在 Windows 网络编程中 IOCP Input Output Completion Port 是一种高性能的 I O 模型 可以使应用程序能够处理大量并发 I O 操作 IOCP 模型主要通过事件通知和回调函数来处理异步 I O 操作
  • 最长01交替子串(浪潮笔试题)

    题意 给一个只有0和1的字符串 允许反转一个连续区间 即0变成1 1变成0 求最长的01交替串多长 允许不连续 我最先想到的是动态规划解法 状态设计方面 首先一个串的状态会有以0结尾和以1结尾两种 然后题目中说允许反转一个连续区间 那么根据
  • 【JavaEE】_JavaScript(WebAPI)

    目录 1 DOM 1 1 DOM基本概念 1 2 DOM树 2 选中页面元素 2 1 querySelector 2 2 querySelectorAll 3 事件 3 1 基本概念 3 2 事件的三要素 3 3 示例 4 操作元素 4 1
  • vue3使用高德地图完成标注点聚合

  • Linux内核提权漏洞CVE-2023-32233复测及POC脚本

    近日 研究人员发现了Linux内核的NetFilter框架中的新漏洞 CVE 2023 32233 该漏洞可被本地用户用于将权限提升为root 并完全控制系统 问题的根源在于tfilter nf tables是如何处理批处理请求的 经过身份
  • C++引用(&)解析:引用的作用,什么时候使用引用,引用与指针的不同

    引用是什么 什么时候使用引用 做函数的参数 做函数的返回值 引用与指针的不同 引用是什么 引用是变量的别名 理论上不开辟新的空间 符号 是类型标识符的一部分 被引用的数据类型 变量名称 如下图中 变量a 与变量ra 指向同一块内存空间 由此