当前位置: 首页 > news >正文

C++易搞混知识: 指针、引用与取地址运算符对比分析

目录

一、引言

二、一句话快速理解

三、指针(Pointer)

1️⃣ 基本定义

2️⃣ 指针的特点

四、引用(Reference)

1️⃣ 基本定义

2️⃣ 使用效果

3️⃣ 引用的特点

五、取地址运算符 &

六、进阶与易错点总结

6.1 int *p 和 int* p 的区别

6.1.1 为什么会有两种写法?

6.1.2 推荐写法

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

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

6.4 相关扩展知识

6.4.1 解引用运算符 *

6.4.2 常量指针

6.4.3 右值引用(C++11 核心特性)

6.4.3.1 什么是右值引用?

6.4.3.2 左值引用 vs 右值引用

6.4.3.3 为什么需要右值引用?

6.4.4 智能指针(现代 C++ 必备)

6.4.4.1 为什么需要智能指针?

6.4.4.2 智能指针的本质

6.4.4.3 三种常用智能指针


一、引言

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

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

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

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

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

二、一句话快速理解

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

三、指针(Pointer)

1️⃣ 基本定义

int a = 10; int* p = &a;

含义:

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

2️⃣ 指针的特点

可以修改指向

int b = 20; p = &b;

可以为空

int* p = nullptr;

需要解引用访问

cout << *p;

四、引用(Reference)

1️⃣ 基本定义

int a = 10; int& r = a;

含义:

  • r就是a的另一个名字

2️⃣ 使用效果

r = 20; // 此时 a 也变成 20

3️⃣ 引用的特点

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

五、取地址运算符&

int a = 10; int* p = &a;

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

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

int& r = a; // 定义引用 int* p = &a; // 取地址

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

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

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

六、进阶与易错点总结

6.1int *pint* p的区别

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

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

int *p; int* p;

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

6.1.1 为什么会有两种写法?

因为在 C++ 中:

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

看下面代码:

int* p1, p2;

实际含义是:

  • p1是指针
  • p2是普通int

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

6.1.2 推荐写法
int *p1, *p2;

或者:

int* p1; int* p2;

保持风格统一最重要

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

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

其中:

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

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

指针传参

void func(int* p) { *p = 100; } func(&a);

引用传参

void func(int& r) { r = 100; } func(a);

6.4 相关扩展知识

6.4.1 解引用运算符*
*p

通过地址来访问变量

6.4.2 常量指针
const int* p; // 不能修改指向的值,可以修改指针本身! int* const p; // 不能修改指针本身
6.4.3 右值引用(C++11 核心特性)
6.4.3.1 什么是右值引用?
int&& r = 10;

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

6.4.3.2 左值引用 vs 右值引用
int a = 10; int b = a; // a 是左值 int c = 10; // 10 是右值

核心区别:

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

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

看一个例子:

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

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

6.4.4 智能指针(现代 C++ 必备)
6.4.4.1 为什么需要智能指针?

传统指针的问题:

int* p = new int(10); // 忘记 delete → 内存泄漏

常见问题:

  • 内存泄漏
  • 重复释放
  • 悬空指针
6.4.4.2 智能指针的本质

用对象管理指针(RAII思想)

#include <memory>

把原本需要手动new/delete的指针资源,交给一个对象来负责生命周期,这个对象在构造时获取资源,在析构时自动释放资源,从而避免内存泄漏和忘记释放的问题。

6.4.4.3 三种常用智能指针
std::unique_ptr<int> p = std::make_unique<int>(10); // 独占所有权 std::shared_ptr<int> p1 = std::make_shared<int>(10); // 共享所有权 std::shared_ptr<int> p2 = p1; std::weak_ptr<int> wp = p1; //解决循环引用
http://www.jsqmd.com/news/616618/

相关文章:

  • 专家答辩:视频不再是监控:基于三维空间智能体的空间计算系统构建与应用
  • Qwen3-Embedding-4B新手指南:可视化界面,轻松玩转文本向量化
  • OpenClaw技能市场指南:为千问3.5-9B寻找合适的功能扩展
  • LeetCode 210 课程表 II | 拓扑排序详解(C语言实现)
  • Swoole 5.0适配踩坑实录,深度解析协程生命周期变更、内存管理新规与RPC协议不兼容问题
  • OpenClaw+Qwen3-14B内容工厂:自动生成技术博客与SEO优化
  • VibeVoice实时语音合成实战:25种音色一键切换,打造多语言语音助手
  • nanobot超轻量级AI助手部署实测:快速体验Qwen3-4B模型的智能回复
  • [具身智能-314]:大语言模型处理文本的全过程
  • 镜像视界VS 专家 :空间计算系统最刁钻10问 + 答案
  • 一键部署实时口罩检测-通用:基于Gradio的交互式Web界面快速上手
  • Lychee-Rerank安全加固指南:防止注入攻击与数据泄露
  • Fish-speech-1.5多语言支持实战:13种语言的语音合成技巧
  • 2026年12VDC通讯设备电磁开关/家电用电磁开关多家厂家对比分析 - 品牌宣传支持者
  • 镜像视界数字孪生空间系统:二轮追问反杀清单
  • 5分钟玩转像素语言·跨维传送门:腾讯混元引擎翻译工具实测
  • Ostrakon-VL 终端 Anaconda 虚拟环境管理:多项目 Python 依赖隔离指南
  • Chord实战:用视频分析工具制作智能安防系统,自动检测异常行为
  • 晶振到底是啥?为什么有26M/52M/25M/12M/32.768K?”一口气讲透(工程师秒懂版)
  • 2026年口碑好的汽车电磁开关/新能源电磁开关/通讯设备电磁开关主流厂家对比评测 - 品牌宣传支持者
  • KOOK艺术馆GPU优化:BF16精度下色彩饱和度保持与灰阶过渡实测
  • VibeVoice多场景应用案例:有声读物生成、无障碍阅读工具、IVR系统
  • 优选算法的层序之径:队列专题
  • OpenClaw技能组合方案:千问3.5-27B+OCR实现证件信息提取
  • Gemma-3-12b-it+OpenClaw内容处理:从资料收集到草稿生成全流程
  • YOLO12 WebUI边缘计算部署:低延迟实时检测方案
  • 2026年OptoCraft波前探测器选型推荐榜:Trim200离子束刻蚀机、Essent Optics分光光度计选择指南 - 优质品牌商家
  • PyTorch 2.8镜像部署YOLOv5目标检测模型:环境配置与推理优化
  • 从“人海战术”到“算法军团”:TVA引发的劳动力革命(4)
  • 幻境·流金多模态潜力:结合CLIP文本对齐实现高精度意合生成