C++基础入门之引用

目录

一.引用

1.1引用和取地址

1.2 别名和原名的区别

1.3 引用的用法

1.31 做参数

1.311 输出型参数:形参改变实参

 1.312 可以减少拷贝,增加效率

1.32 引用的约定

 1. 引用必须初始化

 2. 引用定义后,不能改变指向

4. 给指针取别名

 1.33 引用做返回值

错误示范

传值返回:返回a的拷贝

传引用:返回的是a的别名

 结论:如果返回变量出了作用域(生命周期(局部变量))就销毁,不能使用引用返回。

1.4 引用和指针的区别


一.引用

        引用只是给一个变量重新取了一个名字,取了一个别名,不会给引用重新分配空间。

1.1引用和取地址

引用: 在一个类型的后面加上& 等于一个变量。为取别名

int a = 0;
int& b = a;

取地址:在一个变量前面加上&

cout << &b << endl

1.2 别名和原名的区别

别名=原名。鲁迅就是周树人,他们是等价的,所以对其中一个++,他们都++,所以他们输出的结果是一样的。

int a =0;
int& b =a;
cout << &b <<endl;
cout << &a <<endl;
b++;
a++;

  1.  别名可以有多个。
  2.  可以给别名取别名。

1.3 引用的用法

1.31 做参数

1.311 输出型参数:形参改变实参

例如交换两个数的函数,在C语言中,由于形参是实参的拷贝,所以如果想让形参改变实参就要传地址,然后形参用指针接收

void swap(int* a,int* b)
{...
}
int main()
{int x =5;int y =6;swap(&x,&y);
}

在C++里就不用,直接用别名,因为别名就等价于原名,对别名的改变就等于改变原名

void swap(int& a,int& b)
{int tmp = a;a = b;b =tmp;
}
int main()
{int x =5;int y =6;swap(x,y);
}
 1.312 可以减少拷贝,增加效率

1.32 引用的约定

1. 引用必须初始化

2. 引用定义后,不能改变指向

3. 一个变量可以有多个别名

4. 也可以给指针取别名

 1. 引用必须初始化
int a = 0;
int &b = a;

下面是错误代码,因为引用必须初始化。

int a = 0;
int &b;
b = c;
 2. 引用定义后,不能改变指向
int a = 0;
int &b = a;
int c = 2;
b = c;     //这里不是改变指向,而是将C的值赋给b

 这里b是a的别名,b = c 不是将b的指向从a变为c,而是将C的值赋给b。这是因为引用的指向不能改变。

4. 给指针取别名

 下面是C语言写法

void PushBack(struct Node** pphead,int x)
{*pphead = newnode;
}
int main()
{Struct Node * plist =NULL;PushBack(&plist,1);
}

C++写法,可以对指针取别名

void PushBack(int*& phead,int x)
{}
int main()
{Struct Node * plist =NULL;PushBack(&plist,1);
}

 1.33 引用做返回值

错误示范
传值返回:返回a的拷贝

下面代码虽然调用了函数,但是并不能返回0;

这就涉及到函数栈帧的问题。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;int func()
{int a = 0;return a;
}
int main()
{int ret = func();cout << ret << endl;return 0;
}

第一步给主函数创建栈帧,然后是给局部变量ret创建栈帧,再是调用函数func,第四步 是给func创建栈帧,第五步给局部变量a创建栈帧,第六步返回return,但是由于a是局部变量,所以a出了作用域栈帧就销毁了,所以return的将不会是a的值。

 

传引用:返回的是a的别名

 这是& func会是野引用。返回也不是0,而是a的别名,结果是返回一个随机值。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;int& func()
{int a = 0;return a;
}
int main()
{int ret = func();cout << ret << endl;return 0;
}
 结论:如果返回变量出了作用域(生命周期(局部变量))就销毁,不能使用引用返回。

1.4 引用和指针的区别

  1.  引用大部分功能是一样的,但是引用不能完全代替指针。
  2. 引用不能代替指针的原因就是:引用的指向不能改变,但是指针可以
    1. 例如:链表,二叉树等,插入删除。他们的插入删除,涉及到next域的传递改变指向。

 

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

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

相关文章

【Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)】

Linux环境基础开发工具的使用yum、vim、gcc、g、gdb、make/Makefile Linux软件包管理器- yumLinux下安装软件的方式认识yum查找软件包安装软件如何实现本地机器和云服务器之间的文件互传卸载软件 Linux编辑器 - vimvim的基本概念vim下各模式的切换vim命令模式各命令汇总vim底行…

聊聊JIT优化技术

&#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是小徐&#x1f947;☁️博客首页&#xff1a;CSDN主页小徐的博客&#x1f304;每日一句&#xff1a;好学而不勤非真好学者 &#x1f4dc; 欢迎大家关注&#xff01; ❤️ 我们知道&#xff0c;想要把高级语言转变成计算…

《动手学深度学习(PyTorch版)》笔记7.7

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

Python中的嵌套字典访问与操作详解

前言 在Python编程中&#xff0c;嵌套字典是一种常见的数据结构&#xff0c;它可以以层次结构的方式组织和存储数据。嵌套字典通常包含字典内嵌套在其他字典中&#xff0c;创建了一种多层级的数据结构。本文将详细介绍如何在Python中访问和操作嵌套字典&#xff0c;包括访问、…

卷积层Conv1d包含的元素分别是什么,经过卷积层,数据的形状发生变化吗?

nn.Conv1d 是一个一维卷积层&#xff0c;它通常用于处理序列数据&#xff0c;如时间序列或文本数据。这个层包含以下主要元素&#xff1a; 输入通道数&#xff08;In_channels&#xff09;&#xff1a;这是输入数据的通道数。对于单通道数据&#xff08;如灰度图像或单变量时间…

Leetcode3021. Alice 和 Bob 玩鲜花游戏

Every day a Leetcode 题目来源&#xff1a;3021. Alice 和 Bob 玩鲜花游戏 解法1&#xff1a;数学 Alice 和 Bob 在一个长满鲜花的环形草地玩一个回合制游戏。环形的草地上有一些鲜花&#xff0c;Alice 到 Bob 之间顺时针有 x 朵鲜花&#xff0c;逆时针有 y 朵鲜花。 游戏…

Ubuntu环境下安装部署Nginx(有网)

本文档适用于在Ubuntu20.04系统下部署nginx 一、使用apt-get命令安装nginx 注&#xff1a;以下命令都是在root用户下使用 1. 检查是否存在apt命令 apt –version 说明&#xff1a;出现版本号就说明当前环境存在apt 2. 更新apt命令 apt update 3. 安装nginx apt-get in…

containerd中文翻译系列(十八)containerd支持NRI

节点资源接口 NRI 是节点资源接口&#xff08;Node Resource Interface&#xff09;&#xff0c;它是一个通用框架&#xff0c;用于将扩展功能插入兼容 OCI 的容器运行时。它提供了插件跟踪容器状态并对其配置进行有限的更改改的基本机制。 NRI 本身与任何容器运行时的内部实…

猫头虎分享已解决Bug || AJAX请求错误(AJAX Request Error):AJAX Error: 404 Not Found

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

SpringIOC之support模块ReloadableResourceBundleMessageSource

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

分布式系统架构介绍

1、为什么需要分布式架构&#xff1f; 增大系统容量&#xff1a;单台系统的性能瓶颈&#xff0c;多台机器才能应对大规模的应用场景&#xff0c;所以就需要我们的应用支撑平台具备分布式架构。 加强系统的可用&#xff1a;为了满足业务的SLA要求&#xff0c;需要通过分布式架构…

uniapp的配置和使用

①安装环境和编辑器 注册小程序账号 微信开发者工具下载 uniapp 官网 HbuilderX 下载 首先先下载Hbuilder和微信开发者工具 &#xff08;都是傻瓜式安装&#xff09;&#xff0c;然后注册小程序账号&#xff1a; 拿到appid&#xff1a; ②简单通过demo使用微信开发者工具和…

Linux开发工具的使用 (gcc/g++ | gdb)

目录 一、gcc/g 1.关于gcc/g 2.gcc如何使用 gcc选项&#xff1a; 预处理&#xff1a; 编译: 汇编: 连接: 函数库是什么&#xff1a; 函数库分为动态库和静态库两种 二、调试器gdb 1.关于gdb 2. gdb的使用 gdb选项&#xff1a; Linux是一个广泛用于开发的操作系统&…

关于数字图像处理考试

我们学校这门科目是半学期就完结哦&#xff0c;同学们学习的时候要注意时间哦。 选择题不用管&#xff0c;到时候会有各种版本的复习资料的。 以下这些东西可能会是大题的重点&#xff1a; 我根据平时代码总结的&#xff0c;供参考 基本操作&#xff1a; 1.读图&#xff1a;…

新书速览|PyTorch 2.0深度学习从零开始学

实战中文情感分类、拼音汉字转化、中文文本分类、拼音汉字翻译、强化学习、语音唤醒、人脸识别 01 本书简介 本书以通俗易懂的方式介绍PyTorch深度学习基础理论&#xff0c;并以项目实战的形式详细介绍PyTorch框架的使用。为读者揭示PyTorch 2.0进行深度学习项目实战的核心技…

Springboot+vue的社区智慧养老监护管理平台设计与实现(有报告),Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的社区智慧养老监护管理平台设计与实现&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的社区智慧养老监护管理平台设…

GPIO输入

GPIO输入 实现的功能&#xff1a;按键控制LED、光敏传感器控制蜂鸣器 按键&#xff1a;常见的输入设备&#xff0c;按下导通&#xff0c;松开断开 按键抖动&#xff1a;由于按键内部使用的是机械弹簧片来进行通断的&#xff0c;所以在按下和松手的瞬间会伴随有一连串的抖动。 …

Linux匿名管道

目录 1.原理 1.直接原理 2.本质原理 2.管道接口 3.管道中的四种情况 1.读写端正常&#xff0c;管道如果为空&#xff0c;读端就要堵塞 2.读写端正常&#xff0c;管道如果被写满&#xff0c;写端就要堵塞 3.读端正常&#xff0c;写端关闭&#xff0c;读端就会读到0&#…

图书系统的Web实现(含源码)

源码地址https://gitee.com/an-indestructible-blade/project 注意事项&#xff1a; BorrowBooksWeb\src\main\resources路径下的application.yml文件里面的url&#xff0c;username&#xff0c;password这三个属性和自己的数据库保持一致。 浏览器访问url:http://127.0.0.1:…

three.js 匀速动画(向量表示速度)

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div>1. 匀速动画(向量表示速度)</div…