讲师中心 微信公众号
AI工具推荐 视频效率加速

C++指针与引用的区别 _ 内存地址操作与底层原理【详解】

酷瑶小哥_4950

酷瑶小哥_4950

发布时间:2026-04-08 12:31:35

|

644人浏览过

|

来源于php中文网

原创

指针可为空且支持算术运算,引用必须绑定有效对象且不可重绑定;指针占固定字节,引用不占额外空间;函数参数优先用指针或optional表达可选性,避免误用引用。

c++指针与引用的区别 _ 内存地址操作与底层原理【详解】

指针可以为空,引用必须绑定有效对象

这是最常踩的坑:用未初始化的引用会直接编译失败,而指针若没初始化或赋为 nullptr,后续解引用就会触发未定义行为(常见崩溃或随机值)。C++ 标准强制要求引用在声明时就必须初始化,且之后不能再改绑——它不是“别名变量”,而是对象的另一个名字。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 函数参数想表达“可选对象”时,优先用 const T* 或 std::optional<t></t>,别用 T& 加空检查(引用没法为空)
  • 返回局部对象的引用是危险操作,编译器未必报错,但运行时栈已被回收,访问即 UB;指针同理,但至少你能显式写 return nullptr 做防御
  • int x = 42; int& r = x; int* p = &x; —— 这里 r 和 x 共享同一内存地址,p 存的是那个地址的值;&r 和 &x 结果相同,但 &p 是另一个地址(指针变量自身的地址)

引用不占额外存储空间,指针一定占 sizeof(void*) 字节

这是底层原理的关键差异。引用本身不是对象,编译器通常将其优化为直接访问原变量地址(不生成独立符号),所以 sizeof(int&) 就是 sizeof(int);而指针是实实在在的变量,无论指向什么类型,在 64 位系统上都占 8 字节。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 结构体里存大量“别名”字段时,用引用成员会出错(C++ 不允许),只能用指针;反过来,想节省空间且确定不为空,传参/返回用引用更轻量
  • 调试时看汇编:int& r = x; 后续所有对 r 的读写,通常直接转成对 x 地址的操作,没有中间跳转;而 *p 一定会有一条 mov eax, [rax] 类似的间接寻址指令
  • 类成员函数中,this 是个隐式 T*,不是 T&——这也说明“当前对象”是以指针形式传递的,只是语法糖让你用 . 而非 ->

指针支持算术运算和多级间接,引用只能单层绑定

指针本质是地址值,能加减、比较、做数组偏移;引用一旦绑定,就锁死到一个对象,不能“指向下一个”。这也是为什么 vector::data() 返回 T* 而不是 T&:你需要遍历连续内存。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 遍历 C 风格数组或 std::array 时,用指针迭代比用引用更自然:for (int* p = arr; p != arr + N; ++p) { ... };引用无法自增
  • 实现类似 std::span 的视图类时,底层必须用指针+长度,引用无法表达“起始位置+偏移”语义
  • 二级指针 int** 可以修改指针本身的值(比如函数内重新 malloc 并赋给外部指针),而引用参数 int*& 才能达到同样效果——普通 int& 只能改所指对象的值,改不了指针变量自己

函数重载与模板推导中,指针和引用的行为完全不同

编译器对引用类型更“敏感”:void f(int&) 和 void f(const int&) 是两个重载,但 void f(int*) 和 void f(const int*) 中的 const 修饰的是所指内容,不影响重载决议;模板参数推导时,T& 能接受左值并保留 cv 限定,T* 则可能退化为 T。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 写通用函数时,如果想让调用者明确传入左值(避免临时对象绑定),用 void f(T&);若允许右值,用 void f(const T&) 或 void f(T&&)
  • 避免写 template<typename t> void g(T*)</typename> 然后传入数组——数组名会退化为指针,丢失长度信息;改用 template<size_t n> void g(int (&)[N])</size_t> 更安全
  • 调试模板实例化失败时,先检查参数是指针还是引用:比如 std::vector<int>::iterator</int> 是指针类,但 std::vector<int>::reference</int> 是 int&,混用会导致类型不匹配

真正容易被忽略的是:引用的“不可重绑定”特性在 RAII 类型中常被误用——比如把 std::fstream& 当作类成员,以为能延迟绑定,结果编译不过;这时候必须用指针或 std::optional<:fstream></:fstream>。

热门AI工具

更多
立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2298

2023.09.20

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

4974

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

5151

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6799

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3265

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4248

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2905

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

636

2023.11.23

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn