news 2026/8/21 16:57:00

C++指针、引用与取地址运算符对比分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++指针、引用与取地址运算符对比分析

一、引言

在学习 C++ 的过程中,初学者很容易会被这几个概念搞混:

  • 指针(Pointer)
  • 引用(Reference)
  • 取地址运算符(&)

尤其是初学者,经常会问:

  • int* pint *p有区别吗?
  • &到底是取地址还是引用?
  • 指针和引用是不是一回事?

这篇文章帮你一次性彻底搞懂这些核心概念

二、一句话快速理解

  • 指针:存储“地址”的变量
  • 引用:变量的“别名”
  • &:取地址运算符(同时也用于定义引用)

三、指针(Pointer)

1️⃣ 基本定义

1

2

inta = 10;

int* p = &a;

含义:

  • p存的是a的地址
  • *p才是访问a的值

2️⃣ 指针的特点

可以修改指向

1

2

intb = 20;

p = &b;

可以为空

1

int* p = nullptr;

需要解引用访问

1

cout << *p;

四、引用(Reference)

1️⃣ 基本定义

1

2

inta = 10;

int& r = a;

含义:

  • r就是a的另一个名字

2️⃣ 使用效果

1

2

r = 20;

// 此时 a 也变成 20

3️⃣ 引用的特点

必须初始化
不能重新绑定
使用时像普通变量(不需要*

五、取地址运算符&

1

2

inta = 10;

int* p = &a;

&a表示:获取变量a的地址

⚠️ 注意:&有两种用途!

1

2

int& r = a;// 定义引用

int* p = &a;// 取地址

下面用一个表格对上面的内容做一个总结:

特性指针引用&运算符
本质变量别名操作符
是否占内存是(通常实现为指针)
是否可为空-
是否可改变指向-
使用方式*p直接用&a
安全性较低更安全-

在 C/C++ 中,取地址运算符&得到的是变量在程序中的“内存地址”,但这个地址本质上是由操作系统提供的虚拟地址,而不是真实的物理内存地址;程序可以通过这个地址访问数据,但底层还需要经过操作系统和硬件(如内存管理单元)的转换才能映射到实际的物理内存。

六、进阶与易错点总结

6.1int *p和int* p的区别

很多人会纠结这一点,其实结论很简单:

两者完全等价,没有任何本质区别

1

2

int*p;

int* p;

都表示:p是一个指向int的指针,编译器处理完全一致

6.1.1 为什么会有两种写法?

因为在 C++ 中:

*实际是“修饰变量”,不是类型的一部分

看下面代码:

1

int* p1, p2;

实际含义是:

  • p1是指针
  • p2是普通int

这也是很多初学者踩坑的地方

6.1.2 推荐写法

1

int*p1, *p2;

或者:

1

2

int* p1;

int* p2;

保持风格统一最重要

6.2 指针 vs 引用(核心对比)

特性指针引用
本质存地址的变量变量别名
是否可为空
是否可改指向
访问方式*p直接使用
安全性较低更安全

其中:

  • 指针更灵活,但更容易出错
  • 引用更安全,但限制更多

6.3 函数传参对比(高频考点)

指针传参

1

2

3

4

voidfunc(int* p) {

*p = 100;

}

func(&a);

引用传参

1

2

3

4

voidfunc(int& r) {

r = 100;

}

func(a);

6.4 相关扩展知识

6.4.1 解引用运算符*

1

*p

通过地址来访问变量

6.4.2 常量指针

1

2

constint* p;// 不能修改指向的值,可以修改指针本身!

int*constp;// 不能修改指针本身

6.4.3 右值引用(C++11 核心特性)
6.4.3.1 什么是右值引用?

1

int&& r = 10;

&&表示右值引用(rvalue reference)

6.4.3.2 左值引用 vs 右值引用

1

2

3

inta = 10;

intb = a;// a 是左值

intc = 10;// 10 是右值

核心区别:

类型特点
左值(lvalue)有名字、可取地址
右值(rvalue)临时值、不能取地址
6.4.3.3 为什么需要右值引用?

为了解决一个核心问题:避免不必要的拷贝,提高性能

看一个例子:

1

2

std::string s1 ="hello";

std::string s2 = s1;// 拷贝(慢)

如果是临时对象(右值),它本身马上就要被销毁,如果还像普通变量一样进行拷贝,就会产生一次不必要的内存复制(比如std::stringvector这种内部带堆内存的数据结构),既浪费时间又浪费空间;而引入右值引用(&&)后,程序可以直接“接管”这个临时对象内部已经分配好的资源(如指针指向的内存),而不是重新申请和复制,这就是“移动语义”。右值引用的本质作用就是:针对临时对象,避免不必要的拷贝,通过资源转移来提升性能,同时保持代码安全(由对象自动管理资源)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 16:53:44

多智能体强化学习通信优化:K步可达与干扰感知机制详解

1. 从“鸡同鸭讲”到“心有灵犀”&#xff1a;多智能体强化学习中的通信困境在现实世界的协作任务里&#xff0c;比如一群无人机协同搜索、多机器人协同搬运&#xff0c;或者一个游戏里多个角色需要配合推塔&#xff0c;智能体之间如果缺乏有效沟通&#xff0c;那场面简直堪比“…

作者头像 李华
网站建设 2026/8/21 16:51:34

2026年转行网络安全最全优势解析!为什么网安是IT最后的避风港?

2026年转行网络安全最全优势解析&#xff01;为什么网安是IT最后的避风港&#xff1f; 2026年的IT行业&#xff0c;早已告别“遍地高薪、轻松就业”的红利时代。 开发内卷严重、CRUD工作同质化严重、年年更新技术栈、35岁优化常态化&#xff1b;运维、测试岗位持续缩减、可替代…

作者头像 李华
网站建设 2026/8/21 16:49:32

安卓虚拟定位完整指南:用 FakeLocation 为每个 App 单独模拟位置

安卓虚拟定位完整指南&#xff1a;用 FakeLocation 为每个 App 单独模拟位置 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation 你有没有遇到过这样的需求&#xff1a;想让某个 App …

作者头像 李华