C/C++ 引用和指针的区别及使用场景

devtools/2024/10/19 2:24:36/

C和C++中的引用(reference)和指针(pointer)都是用于间接访问变量的工具,但它们之间存在一些关键的区别和使用场景。

一、什么是引用(Reference)?

引用是只有在C++中才存在的概念,C语言是没有引用的。
定义引用是变量的别名,换句话说,就是为其起一个外号。一旦引用被初始化为一个变量,就不能再被改变为另一个变量的引用
初始化引用必须在定义时初始化,并且一旦初始化后,其值(即它所引用的变量)就不能再改变。
引用引用不需要解引用操作符(如*),它直接表示它所引用的变量的值。
赋值:通过引用可以修改它所引用的变量的值。
内存引用不占用额外的内存空间(除了它引用的变量本身的内存)。

1、案例:

#include <iostream>using namespace std;int main(void)
{int a = 100;int &b = a;// 输出值cout << a << endl;cout << b << endl;// 值加一a++;// 输出值cout << a << endl;cout << b << endl;// 输出地址cout << &a << endl;cout << &b << endl;return 0;
}

输出如下:

100
100
101
101
0xd0df3ff8f4
0xd0df3ff8f4

通过上面案例可以看到变量a和a的引用b的地址是一样的,并且变量a的值改变,引用b随之而变。

2、使用场景:

  • 函数参数传递:当你想确保函数内部对参数的修改能够反映到原始变量上时,可以使用引用。这通常用于输出参数或需要修改传入参数的情况。
  • 避免拷贝开销:与指针类似,引用也可以用于避免大型对象的拷贝开销。当对象作为函数参数传递或通过函数返回时,使用引用可以避免不必要的拷贝。
  • 支持操作符重载:在重载操作符时,引用可以使得操作符的使用看起来更像内置类型。例如,重载+操作符时,可以使用引用来允许连续的操作,如a = b + c + d。
  • 提供清晰的接口:在某些情况下,使用引用可以使得函数接口更加直观和易于理解。例如,一个名为swap的函数,通过引用交换两个变量的值,其意图非常明确。
  • 引用指针更安全:由于引用必须在声明时被初始化,并且之后不能再改变所引用的对象,因此它们在某些情况下比指针更安全。你不需要担心引用会被重新赋值为指向另一个对象或空指针

二、什么是指针(Pointer)?

定义指针是一个变量,其值为另一个变量的地址;
初始化指针可以在定义时初始化,也可以稍后初始化。
引用:通过解引用操作符(*)可以访问指针所指向的变量的值。
赋值指针的值(即它所指向的地址)可以改变,但解引用后访问的变量值也可以被改变。
内存指针本身占用内存空间,其大小为平台相关(通常是几个字节)。

1、案例:

#include <iostream>
using namespace std;int main(void)
{int a = 100;int *p = &a; // p是一个指针,指向a的地址// 输出值cout << a << endl;cout << *p << endl; // *p表示p指向的地址的值,即a的值// 值加一(*p)++; // 通过指针修改a的值// 输出值cout << a << endl;cout << *p << endl;// 输出地址cout << &a << endl;cout << p << endl; // p的值就是&a,即a的地址return 0;
}

输出如下:

100
100
101
101
0x49a83ffba4
0x49a83ffba4

2、使用场景:

  • 动态内存分配:指针常用于动态内存分配,如使用new和delete操作符来在堆上创建和销毁对象。指针可以指向动态分配的内存块,并在不再需要时释放它。
  • 数据结构的构建:在构建如链表、树和图等复杂数据结构时,指针是不可或缺的。它们用于连接数据结构的各个部分,如链表中的节点。
  • 函数参数传递:当需要传递大型对象或数据结构到函数中,但又不想进行昂贵的拷贝操作时,可以使用指针。函数可以通过指针直接访问原始数据,从而节省资源并提高效率。
  • 实现高级功能:指针可以用于实现诸如函数指针(用于回调函数或策略模式)、数组的动态分配和调整大小等高级功能。
  • 兼容性与C语言互操作:在与C语言代码互操作时,指针是必不可少的,因为C语言没有引用的概念。

三、引用指针的区别

引用是在概念上定义一个变量的别名,而指针是存储一个变量的地址。
引用必须从一而终,不能再指向其他数据;指针可以随意改变指向。
引用在定义时必须初始化,而指针是最好初始化,不初始化也不会报错。
指针可以有多级,引用不可以。
存在空指针,但是不存在空引用


http://www.ppmy.cn/devtools/46808.html

相关文章

【数据结构与算法 | 力扣篇】力扣每日一题575, 1103

1. 力扣575 : 分糖果 (1). 题 Alice 有 n 枚糖&#xff0c;其中第 i 枚糖的类型为 candyType[i] 。Alice 注意到她的体重正在增长&#xff0c;所以前去拜访了一位医生。 医生建议 Alice 要少摄入糖分&#xff0c;只吃掉她所有糖的 n / 2 即可&#xff08;n 是一个偶数&#…

第N4周:中文文本分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、预备知识 中文文本分类和英文文本分类都是文本分类&#xff0c;为什么要单独拎出来个中文文本分类呢&#xff1f; 在自然语言处理&#xff08;NLP&#x…

商品详情接口在独立站的应用及接口请求示例

商品详情接口在独立站的应用主要体现在以下几个方面&#xff0c;这些应用不仅提升了独立站的运营效率&#xff0c;也优化了用户体验&#xff1a; 商品信息查询与展示&#xff1a; 商品详情接口允许独立站通过商品ID或关键词快速查询商品详细信息&#xff0c;包括价格、库存、…

JavaWeb1 Json+BOM+DOM+事件监听

JS对象-Json //Json 字符串转JS对象 var jsObject Json.parse(userStr); //JS对象转JSON字符串 var jsonStr JSON.stringify(jsObject);JS对象-BOM BOM是浏览器对象模型&#xff0c;允许JS与浏览器对话 它包括5个对象&#xff1a;window、document、navigator、screen、hi…

【通信协议-RTCM】RTCM通信协议常用英文缩写词汇对照表

RTCM通信协议常用英文缩写词汇对照表 ARP ---- Antenna Reference Point 天线参考点BDS ---- BeiDou Navigation Satellite System 北斗卫星导航系统CRS ---- Coordinate Reference System 坐标参考系ECEF ---- Earth Centered Earth Fixed 地心地固坐标系GLONASS ---- Global…

音视频开发—V4L2介绍,FFmpeg 打开摄像头输出yuv文件

实验平台&#xff1a;Ubuntu20.04 摄像头&#xff1a;1080P 监控摄像头&#xff0c;采用V4L2驱动框架 文章目录 1.V4L2相关介绍1.1. 基本概念1.2. 主要功能1.3. V4L2驱动框架1.4. 主要组件1.5. 使用V4L2的应用1.6. 常用V4L2工具 2.ffmpeg命令实现打开摄像头输出yuv文件3.使用C…

DRIVEN|15分的CNN+LightGBM怎么做特征分类,适用于转录组

说在前面 今天分享一篇做深度学习模型的文章&#xff0c;这是一篇软硬结合的研究&#xff0c;排除转换实体产品&#xff0c;我们做生信基础研究的可以学习模仿这个算法&#xff0c;适用且不局限于临床资料&#xff0c;转录组数据&#xff0c;GWAS数据。 今天给大家分享的一篇文…

Mysql——索引

索引的类型 按「数据结构」分类&#xff1a;Btree索引、Hash索引、Full-text索引。按「物理存储」分类&#xff1a;聚簇索引&#xff08;主键索引&#xff09;、二级索引&#xff08;辅助索引&#xff09;。按「字段特性」分类&#xff1a;主键索引、唯一索引、普通索引、前缀…