C++ 引用和指针:内存地址、创建方法及应用解析

小万哥
• 阅读 45

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,关注后即可获取最新文章推送

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

点赞
收藏
评论区
推荐文章
cpp加油站 cpp加油站
2年前
c++中引用面试点7连问以及引用真的不分配内存吗
本篇文章从面试官的口吻连问7个引用有关的问题,并且从汇编的层面上对引用进行深入分析,让你充分理解引用的概念和原理。首先还是看一下思维导图:1.引用的背景和概念说到引用,首先要说一下'&'标识符,其实c语言中这个符号只是用来取地址的,并没有引用的概念,直到c对这个标识符的作用进行了扩充,才有了引用这个概念。所谓引用,其实就是给变量取了一个别名,一个简单
待兔 待兔
3年前
[Dart]Dart语言之旅<二>:变量
变量以下是创建变量并为其分配值的示例:varname'Bob';变量是引用。名为name的变量包含对值为“Bob”的String类型的对象的引用。默认值未初始化的变量的初始值为null。即使是数字类型的变量,初始值也为null,因为数字也是对象。intlineCount;assert(lineCountnull)
Wesley13 Wesley13
2年前
java学习笔记3
1 创建引用类型变量公式    数据类型 变量名new数据类型();    变量名.方法名();2 Scanner类的使用!(https://oscimg.oschina.net/oscnet/f0aaacf3774ded91479f8e42c680794aa8c.jpg)!(https://oscimg.oschi
Wesley13 Wesley13
2年前
Java四种引用类型
引用与对象每种编程语言都有自己操作内存中元素的方式,例如在C和C里是通过指针,而在Java中则是通过“引用”。在Java中一切都被视为了对象,但是我们操作的标识符实际上是对象的一个引用(reference)。//创建一个引用,引用可以独立存在,并不一定需要与一个对象关联Strings;
Wesley13 Wesley13
2年前
C++学习_从C到C++
一、引用的概念和应用 1.引用的概念下面写法定义了一个引用,并将其初始化为引用某个变量。类型名&引用名某变量名;intn4;int&rn;//r引用了n,r的类型是int&某个变量的引用,等价于这个变量,相当于该变量的一个别
Wesley13 Wesley13
2年前
C++:指针和引用
引用的概念及用法 所谓的引用并不是说重新定义的一个新的变量,而是给一个已经定义好了的变量起的一个别名。 下面看看引用到底是如何使用的:voidtest1(){  inta1;  int&ba;//引用变量b是a的别名  std::cout<<"a:address"<<&a<<std::
Wesley13 Wesley13
2年前
Java中的引用类型和垃圾回收
强引用StrongReferences  强引用是最常见的引用:  比如:StringBufferbuffernewStringBuffer();  创建了一个StringBuffer类的对象,并用一个变量buffer存储对这个对象的引用。这就是个强引用。  变量持有的是这个对象的引用。通常,引用是一个对象的存储地址。
Wesley13 Wesley13
2年前
PHP垃圾回收机制
php5.3之前使用的垃圾回收机制是单纯的“引用计数”,也就是每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器1;当变量引用撤掉后,计数器1;当计数器0时,表明内存对象没有被使用,该内存对象则进行销毁,垃圾回收完成。“引用计数”存在问题,就是当两个或多个对象互相引用形成环状后,内存对象的计数器则不会消减为0;这时候,这一组内存对象已经
小万哥 小万哥
3个月前
C 语言指针完全指南:创建、解除引用、指针与数组关系解析
C语言中的指针创建指针我们可以使用引用运算符&获取变量的内存地址:cintmyAge43;//一个int变量printf("%d",myAge);//输出myAge的值(43)printf("%p",&myAge);//输出myAge的内存地址(0x7ff
小万哥 小万哥
2星期前
C++ 解引用与函数基础:内存地址、调用方法及声明
C解引用获取内存地址和值在上一页的示例中,我们使用了指针变量来获取变量的内存地址(与引用运算符&一起使用)。但是,你也可以使用指针来获取变量的值,这可以通过使用运算符(解引用运算符)来实现:cstringfood"Pizza";//变量声明stri