【C++初阶(三)】引用详解(对比指针)

这篇具有很好参考价值的文章主要介绍了【C++初阶(三)】引用详解(对比指针)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:C++初阶之路⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学习排序知识
  🔝🔝


【C++初阶(三)】引用详解(对比指针),C++初阶之路,c++,开发语言

1. 前言

C语言中有一利器: 指针
而C++中增加了另一利器: 引用
这两个板块的存在
极大了提升了C/C++的可用性!

【C++初阶(三)】引用详解(对比指针),C++初阶之路,c++,开发语言

本篇文章将给大家详细讲解引用
并且分析引用和指针的联系和区别
最后给大家拓展C++中的空指针


2. 引用的概念

概念:

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空
间,它和它引用的变量共用同一块内存空间

比如说孙悟空又叫
孙行者,齐天大圣,斗战胜佛

李逵又叫黑旋风,铁牛

类型& 引用变量名(对象名) = 引用实体
引用符号:&

举个例子来说明:

	int a = 10;
    int& ra = a;//<====定义引用类型
    printf("%p\n", &a);//打印地址
    printf("%p\n", &ra);

打印出来的地址相同
【C++初阶(三)】引用详解(对比指针),C++初阶之路,c++,开发语言


并且引用值改变,原先的值也会改变!

int a = 10;
    int& ra = a;
    cout << ra <<' '<< a;
    cout << endl;
    ra = 20;
    cout << ra << ' ' << a;

a的值会从10被修改成20
【C++初阶(三)】引用详解(对比指针),C++初阶之路,c++,开发语言


3. 引用的特性

引用特性:

  1. 引用在定义时必须初始化
  2. 一个变量可以有多个引用
  3. 一旦引用一个实体,就不能引用其他实体

特性讲解:

int a = 10;
int& ra; // 没初始化,会报错
int& ra = a;
int& rra = a;
int& rrra = a;
//这三个都是a的引用,只要其中一个
//发生改变,其他三个也会改变
printf("%p %p %p %p\n", &a, &ra, &rra, &rrra);  
int a = 10;
int& ra = a;
int b = 20;
ra = b; //这条语句的意思是将b的值赋值给a
        //而不是ra从a的引用变成b的引用
cout << ra << ' ' << a << ' ' << b;
cout << endl;
printf("a的地址:%p ra的地址:%p b的地址:%p", &a, &ra, &b);

可以看见ra的地址和a是一样的
一旦引用初始化后就不能改变引用对象

【C++初阶(三)】引用详解(对比指针),C++初阶之路,c++,开发语言


4. 常引用

顾名思义就是引用常量
但是常量具有不可修改性
所以引用一个常量时要加上const

const int a = 10;
//int& ra = a;   // 该语句编译时会出错,a为常量
const int& ra = a;
// int& b = 10; // 该语句编译时会出错,b为常量

const int& b = 10;
double d = 12.34;
//const int& rd = d; // 该语句编译时会出错,类型不同
const double& rd = d;

并且引用的类型要对上

int类型的引用对应int&
double类型的引用对应double&


5. 使用场景

5.1 引用做函数参数

引用做函数参数

之前在写C程序的交换函数时
因为形参是实参的一份拷贝
想要改变实参就要传地址
而现在有了引用就不用传地址了!

void Swap(int& left, int& right)//交换函数
{
   int temp = left;
   left = right;
   right = temp;
}

int a = 10;
int b = 20;
Swap(a,b);//因为形参为引用,所以这传的是a,b的引用

注: 引用传参时,不用加符号&
& 符号放在类型后面时是引用
其他地方& 符号都是取地址!


5.2 引用做函数返回值

引用做返回值

引用做返回值时
可在函数外面修改函数里面的内容
前提是引用的变量出了函数不会销毁

static int n = 0;
int& Count()
{
	n++;
	n++;
	return n;
}

int& tmp = Count();
tmp = 20;
cout << tmp << ' ' << n;

由于局部变量出了作用域会销毁
所以这里在函数中定义的是静态变量

并且修改tmp的值会改变n的值

【C++初阶(三)】引用详解(对比指针),C++初阶之路,c++,开发语言


6. 注意事项

下面这段代码不能用传引用返回:

int& Add(int a, int b)
{
    int c = a + b;
    return c;
}

因为函数调用完后C就被销毁了
而将C的引用返回后
会有类似于使用野指针的风险

总结:

如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。


7. 传值和传引用效率分析

  1. 作为函数返回值的比较
  • 传值返回分析

首先,传值返回并不是单纯的将
返回值直接传给外面的变量
而是会生成一个中间变量的拷贝
这个中间变量再将值拷贝给外面的变量

(注:在栈帧创建与销毁有详细介绍)

画图理解:

【C++初阶(三)】引用详解(对比指针),C++初阶之路,c++,开发语言
然而传引用返回没有这么复杂的过程

综上所述:

因此用值作为参数或者返回值类型
效率是非常低下的
尤其是当参数或者返回值类型非常大时
效率就更低


8. 引用和指针的联系

它们的联系:

  1. 语法层面上

引用在语法概念上就是一个别名
和实体共用一份空间

  1. 底层实现上

引用在底层实现上是有空间的
因为引用是按照指针的方式来实现的
也就是指针的底层汇编和引用一样

左边为引用,右边为指针:

【C++初阶(三)】引用详解(对比指针),C++初阶之路,c++,开发语言


9. 引用和指针的区别

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
  1. 引用在定义时必须初始化,指针没有要求
  1. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
  1. 没有NULL引用,但有NULL指针
  1. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数
  1. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  1. 有多级指针,但是没有多级引用
  1. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  1. 引用比指针使用起来相对更安全

10. 总结以及拓展

总结:

总的来说,C++中更喜欢用引用
特别是在一些容器中,如:栈,队列
使用引用的效率会提高许多
在类和对象中引用也是重量级的存在
所以说引用十分的重要!

【C++初阶(三)】引用详解(对比指针),C++初阶之路,c++,开发语言

拓展:

C++中的空指针不用NULL
而是用nullptr来替代

(nullptr是关键字,使用时不用包头文件)

为了提高C++代码的可读性
在后续表示指针空值时
建议最好使用nullptr。
文章来源地址https://www.toymoban.com/news/detail-521309.html


🔎 下期预告:内联函数和auto关键字 🔍

到了这里,关于【C++初阶(三)】引用详解(对比指针)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言——指针详解(初阶)

    在C语言学习过程中,指针算一个难点。我总结所学的指针知识,写一篇博客,希望大家对指针的知识理解的更通透。 每个内存都有一个唯一的编号,这个编号也被称为地址,C语言创建变量。都要在内存上开辟空间。 编号= = 地址 = =指针 我们可以通过(取地址操作符)取出变

    2024年02月16日
    浏览(36)
  • 【初阶】C语言指针详解——指针必备的7大知识点

    本篇文章我们来了解C语言中指针的相关内容,对于指针可以说是C语言学习中较难理解的内容。本篇以了解指针为目的,以初识为导向,从表层入手,浅析C指针! 理解指针的 两个要点: 指针是内存中一个最小单元的编号,也就是地址 平时口语中说的指针,通常指的是指针变

    2024年02月02日
    浏览(49)
  • 【c++入门】引用详解 | auto的类型推导 | 范围for循环 | nullptr空指针

    🎥 屿小夏 : 个人主页 🔥个人专栏 : C++入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 上篇文章中,对函数重载和内联函数的作用和特性使用,进行了精细的详解。 引用和指针混不清?引用的抽丝剥茧!还有不用写类型可以自动推导的?for遍历竟然还有我们没见过的面

    2024年02月06日
    浏览(138)
  • 【c++速通】入门级攻略:引用详解 | auto的类型推导 | 不一样的for循环 | nullptr版本空指针

    🎥 屿小夏 : 个人主页 🔥个人专栏 : C++入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 上篇文章中,对函数重载和内联函数的作用和特性使用,进行了精细的详解。 引用和指针混不清?引用的抽丝剥茧!还有不用写类型可以自动推导的?for遍历竟然还有我们没见过的面

    2024年02月08日
    浏览(45)
  • 【数据结构和算法初阶(C语言)】复杂链表(随机指针,随机链表的复制)题目详解+链表顺序表结尾

    目录  1.随机链表的复制 1.2题目描述  1.3题目分析 1.4解题: 2.顺序表和链表对比 2.1cpu高速缓存利用率 3.结语 一个长度为  n  的链表,每个节点包含一个额外增加的随机指针  random   该指针可以指向链表中的任何节点或空节点。        构造这个链表的  深拷贝 。 深拷贝

    2024年03月10日
    浏览(83)
  • 【C++初阶】C++入门——引用

    前言:  相信大家在学习C语言的时候,最头疼的就是指针,经常会碰到一级指针、二级指针,这些指针使用起来,稍有不慎就会等导致程序崩溃,为了让广大程序员少掉点头发,C++中提出了 引用 这一概念。当然,在C++的代码中,仍然可以兼容C语言的指针。  在语法上 引用

    2024年02月13日
    浏览(37)
  • 计算机语言 之【C++】入门级知识讲解(命名空间,C++输入输出,缺省参数,函数重载,引用,内敛函数,auto关键字,for循环,指针空值nullptr)

    三点睡六点起,阎王夸我好身体 不到三点我不睡,太平间里抢C位 目录: 前言: 本片博客是以学习过C语言之后进入C++学习为前提,讲解C++入门级知识,为C++之后的学习做铺垫 –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀

    2024年04月11日
    浏览(127)
  • 【C++初阶】引用

      引用就是取别名 ,在语法上它不会开空间,而是和它引用的变量 共用同一块空间 。 对引用的操作也就是对原来变量的操作 。就像现实生活中给人取外号一样,不管是喊外号还是本名,指的都是那个人。 1.引用类型必须和引用实体是 同种类型 的; 2.引用在定义时 必须初

    2024年02月06日
    浏览(28)
  • [开发语言][c++]:左值、右值、左值引用、右值引用和std::move()

    写在前面: 如果你也被 左值、右值、左值引用、右值引用和std::move 搞得焦头烂额,相关概念和理解不够深入,或者认识模棱两可,那么这篇文章将非常的适合你,耐心阅读,相信一定会有所收获~~ 左值: 可以取地址、位于等号左边 – 表达式结束后依然存在的持久对象

    2024年02月02日
    浏览(60)
  • 【C++】初阶 --- 引用(超级详细版!!!)

    引用不是新定义一个变量,而是给 已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 比如:李逵,在家称为\\\"铁牛\\\",江湖上人称\\\"黑旋风\\\" 比如:抓 “周树人” 和我 \\\"鲁迅\\\"有什么关系🤭,本质上其实是一个人 🚩 引用的

    2024年02月14日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包