C++ 引用和指针

创建引用

引用变量是对现有变量的“别名”,它是使用 & 运算符创建的:

string food = "Pizza"; // 食物变量
string &meal = food; // 对 food 的引用

现在,我们可以使用变量名 food 或引用名 meal 来引用食物变量:

cout << food << "\n"; // 输出 Pizza
cout << meal << "\n"; // 输出 Pizza

C++ 内存地址

内存地址

在前一页的示例中,使用 & 运算符创建了一个引用变量。但它也可以用于获取变量的内存地址;即变量在计算机上存储的位置。

当在 C++ 中创建一个变量时,会为该变量分配一个内存地址。当我们给变量赋值时,它将存储在这个内存地址中。

要访问它,使用 & 运算符,结果将表示变量存储的位置:

string food = "Pizza";

cout << &food; // 输出 0x6dfed4

注意:内存地址以十六进制形式表示(0x..)。注意你可能在你的程序中得不到相同的结果。

为什么知道内存地址很有用呢?

引用和指针在 C++ 中非常重要,因为它们使你能够操作计算机内存中的数据 - 这可以减少代码并提高性能。

这两个特性是使 C++ 与其他编程语言(如 Python 和 Java)不同的因素之一。

C++ 指针

创建指针

可以使用 & 运算符获取变量的内存地址:

string food = "Pizza"; // 类型为 string 的食物变量

cout << food;  // 输出 food 的值(Pizza)
cout << &food; // 输出 food 的内存地址(0x6dfed4)

然而,指针是一种将内存地址作为其值的变量。

指针变量指向相同类型的数据类型(如 intstring),并使用 * 运算符创建。将正在处理的变量的地址分配给指针:

string food = "Pizza"; // 类型为 string 的食物变量
string* ptr = &food; // 指针变量,名为 ptr,存储 food 的地址 // 输出 food 的值(Pizza)
cout << food << "\n"; // 输出 food 的内存地址(0x6dfed4)
cout << &food << "\n"; // 使用指针输出 food 的内存地址(0x6dfed4)
cout << ptr << "\n";

示例解释

  • 使用星号 *string* ptr)创建一个名为 ptr 的指针变量,它指向一个字符串变量。注意指针的类型必须与你正在处理的变量的类型匹配。
  • 使用 & 运算符存储名为 food 的变量的内存地址,并将其分配给指针。
  • 现在,ptr 持有 food 的内存地址的值。

提示:声明指针变量有三种方式,但第一种方式是首选的:

string* mystring; // 首选
string *mystring;
string * mystring;

引用和指针的区别

特性 引用 指针
初始化 必须初始化 可以不初始化
可空 不允许空引用 允许空指针
可变性 一旦初始化就不能改变引用指向的变量 可以改变指针指向的变量
解引用 不需要解引用 需要解引用
效率 通常比指针更有效率 通常比引用效率低

什么时候使用引用和指针

  • 使用引用:

    • 函数参数传递:引用可以传递给函数,函数可以直接修改引用指向的变量,而无需创建副本。
    • 提高效率:引用比指针更有效率,因为不需要指针的解引用操作。
  • 使用指针:
    • 动态内存分配:指针用于动态分配和释放内存。
    • 复杂数据结构:指针用于访问和操作复杂数据结构,例如链表和树。

总而言之,引用和指针都是 C++ 中强大的工具,可以用于高效地操作内存和数据。选择使用引用还是指针取决于具体情况。

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎点赞、收藏、关注

C++ 引用和指针:内存地址、创建方法及应用解析的更多相关文章

  1. 通过软引用和弱引用提升JVM内存使用性能的方法(面试时找机会说出,一定能提升成功率)

    初学者或初级程序员在面试时如果能证明自己具有分析内存用量和内存调优的能力,这相当有利,因为这是针对5年左右相关经验的高级程序员的要求.而对于高级程序员来说,如果能在面试时让面试官感觉你确实做过内存调优 ...

  2. 优雅的重载toString方法,打印对象内容而不是打印内存地址的方法

    如果直接在日志或者System.out.println中打印java对象,会打印这个对象的内存地址,而不是具体内容. 为了便于调试,一般的做法有2种: 1.重写toStrong方法 2.将对象传入JS ...

  3. C++中引用和指针详解

    先来分析指针这个东东: 从概念上讲,指针本质上就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 上面的图表示了程序运行时变量的值 ...

  4. python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样

    python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样

  5. “段错误(segment fault)”、“非法操作,该内存地址不能read/write” 非法指针解引用造成的错误。

    小结: 1. “段错误(segment fault)”.“非法操作,该内存地址不能read/write”非法指针解引用造成的错误. <程序员的自我修养 : 链接.装载与库> Q 我写的程序 ...

  6. 段错误 “段错误(segment fault)”、“非法操作,该内存地址不能read/write” 非法指针解引用造成的错误。

    [root@test after_fc_distributed]# ./ffmpeg-linux64-v3.3.1 -i "concat:mymp3tmp/test_0.mp3|mymp3t ...

  7. Python笔记:字典的fromkeys方法创建的初始value同内存地址问题

    dict中的fromkeys()函数可以通过一个list来创建一个用同一初始value的dict. d = dict.fromkeys(["苹果", "菠萝"] ...

  8. 【C++基础学习】引用和指针、重载、函数、内存管理

    第一部分:引用VS指针 引用的含义:变量的别名 注意:变量不能只有别名,必须有一个真实的变量与之相对应 基本数据类型的引用 对别名本身的操作和它的实体的操作是一样的 1.基本数据类型的引用 类型 &a ...

  9. 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理

    1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...

  10. c语言中通过指针将数值赋值到制定内存地址

    1.一种直观的方法 假设现在需要往内存0x12ff7c地址上存入一个整型数0x100.我们怎么才能做到呢? 我们知道可以通过一个指针向其指向的内存地址写入数据,那么这里的内存地址0x12ff7c其本质 ...

随机推荐

  1. 论文《Attention is all you need》阅读笔记

    Attention is all you need Transformer模型 Model Architecture Transformer结构上和传统的翻译模型相同,拥有encoder-decode ...

  2. Ubuntu中安装使用QEMU/KVM/virt-manager运行虚拟机

    本文为原创,原文发布于个人博客网站:Ubuntu中安装使用QEMU/KVM/virt-manager运行虚拟机 有时候我们需要在同一台计算机中使用多种不同操作系统环境,基于已有的同一堆硬件资源来获得不 ...

  3. elementPlus使用el-icon

    按着文档来撒 yarn add @element-plus/icons-vue main.ts import * as ElementIcons from '@element-plus/icons-v ...

  4. 6 定时器 &中断管理&资源管理

    生成函数 周期,多久触发一次定时器(从定时器启动开始计算)  触发什么呢? 回调函数被调用,被谁调用呢 1,tick中断去调用timer函数  Linux中使用这个  (定时器回调函数若执行时间过长, ...

  5. [VueJsDev] 其他知识 - NestJS 学习内容

    [VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html NestJS 学习内容 NestJS 学习总结 Step. ...

  6. 开发环境篇之HALCON数据结构

    开发环境篇之HALCON基础 目录 基本数据分类 图标类数据 Image(图片) Pixel:像素 Channel:通道 Domain:域 图片操作 Region(区域) Region操作 XLD(轮 ...

  7. 使用ConnectivityManager.bindProcessToNetwork绑定特殊网络

    最近测试那边提了一个bug,经过排查后发现其原因:是因为连接的Wi-Fi无法上网,因此在Android系统的多网络策略中,可以上网的SIM移动网络被设置为系统默认网络,投屏组件docker传输与反控模 ...

  8. Android 开发Day3

    每次重新创建一个项目时,需要下载所对应的.gradle文件,但是你的磁盘里有相应的.gradle文件,随着你创建的Project越多,下载的gradle文件就会越多,占用内存就会越大 . 解决方案: ...

  9. Garnet: 力压Redis的C#高性能分布式存储数据库

    今天看到微软研究院开源了一个新的C#项目,叫Garnet,它实现了Redis协议,可以直接将Redis替换为Garnet,客户端不需要任何修改.根据其官网的信息,简单的介绍一下它. 开源仓库地址:ht ...

  10. ZYNQ学习系列之GPIO

    ZYNQ学习系列之GPIO 一.GPIO含义 general purpose IO ,通用目标的IO.所谓通用,就是采用常用的电压标准和电流标准的控制器IO接口,可以初步理解为开发板上的IO口.这种接 ...