news 2026/8/25 16:54:41

指针 vs 引用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
指针 vs 引用

旨在理解指针和引用的区别

Persona("张三");Person*p=&a;//指针Person&r=a;//引用

定义方式

• 指针:Person* p,p 是独立变量,存对象的地址,p 自己有内存。
• 引用:Person& r = a,r 仅仅是对象 a 的别名,引用本身不占用独立内存(编译器层面,逻辑上没有独立实体)。
• 引用定义的时候必须初始化绑定对象,不能先声明后赋值。

Person&r;//❌编译报错,引用必须初始化Person*p;//✅指针可以先定义,后面再赋值 p=&a

能不能改变指向(绑定目标)

• 指针:可以!p = &b;,让指针指向另一个对象。
• 引用:一旦绑定,永远不能换绑定对象。
注意:r = b;不是改变引用绑定,等价a = b,是赋值给原对象 a。

Persona("a"),b("b");Person&r=a;r=b;//❗不是r绑定b!把b拷贝赋值给a,r依旧是a的别名。

是否可以为 NULL / 空

• 指针:Person* p = nullptr; ✅允许,可以是空。
• 引用:不允许为空,引用一定绑定一个有效对象。
• 工程上:引用天然保证不为空;指针要时刻判断nullptr。

使用语法

• 指针:解引用p,访问成员p->setName()
• 引用:直接像对象一样用,r.setName(),不需要
、->

const 修饰的行为(重点)

const Person* p; //指针:指向const对象,指针可改指向
Person* const p; //指针本身const,不能改指向

//引用没有“普通引用const”这种写法
Person& const r = a; // ❌语法非法!引用天生不能改绑定,加const无意义。
实测vs2015编译可以通过,但是报warning C4227: 使用了记时错误: 忽略引用上的限定符,好像标准c++缺少不允许这么写。msvc微软编译器的兼容扩展,跨平台不能这么写。本身没有意义。

const Person& r = a; // ✅const引用:被引用的对象只读

sizeof 结果

• sizeof§:得到指针本身大小(x64 为 8 字节)。
• sizeof®:得到原对象 Person 的大小,不是引用大小。
引用逻辑上没有独立内存,sizeof 看的是它绑定的实体。

拷贝行为

Person* p1 = &a;
Person* p2 = p1; //拷贝指针的值(地址),两个指针指向同一个a

Person& r1 = a;
Person& r2 = r1; //r2也是a的别名,没有拷贝对象
没有构造,没有拷贝构造,没有拷贝赋值运算。

函数参数场景对比

//指针,有可能传入nullptr,函数内部要判空
void funcPtr(Person* p) { if(nullptr == p) return; p->print(); }
//引用,一定是有效对象,不需要判空
void funcRef(Person& r) { r.print(); }

对比项指针 Person* p引用 Person& r
初始化可以先定义,后赋值定义时必须绑定对象
能否为空nullptr 合法绝不允许为空
能否改变指向目标✅p=&b可以修改指向❌绑定后永远不能更换目标
语法访问对象*p,p->xxx直接 r.xxx
sizeof得到指针本身大小 (8 字节 x64)得到原始对象大小
const 语法const Person* / Person* const两种只有const Person&,Person& const非法
内存指针变量自己占内存逻辑上只是别名,无独立内存
传参需要考虑判空一定有效,无需判空
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/25 16:48:40

智能体泛化难题:静态训练在开放世界工具使用中的脆弱性剖析

1. 引言:当智能体走出“温室”最近和几个做AI应用落地的朋友聊天,大家不约而同地提到了一个共同的痛点:在实验室里、在精心构建的测试集上表现堪称完美的智能体(Agent),一旦部署到真实的生产环境&#xff0…

作者头像 李华
网站建设 2026/8/25 16:48:00

突破LLM上下文瓶颈:前瞻性上下文工程提升智能体长程任务表现

1. 项目缘起:当Agent服务遭遇长程任务的“记忆墙” 最近在折腾一个基于大语言模型的智能体项目,目标是让它能处理像“帮我分析过去三个月的销售数据,找出异常波动,并生成一份包含图表和建议的周报”这样的复杂长程任务。理想很丰满…

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

VMware无头模式详解:命令行启动虚拟机的实战指南

1. 什么是 VMware 无头模式?它为什么值得你花 5 分钟搞懂“Vmware 无头模式启动虚拟机(不打开vmware , 直接启动虚拟机),Mac Windows 版本”——这个标题里藏着一个被大量新手忽略、却被运维、开发、测试和自动化工程师天天用的硬…

作者头像 李华
网站建设 2026/8/25 16:44:36

Python标准库深度认知:从工具箱到操作系统级能力层

1. 这不是“工具箱”,而是Python的呼吸系统——为什么标准库值得你花72小时重新认识很多人第一次听说“Python标准库”,脑子里浮现的是一个叫os的模块、一个json函数,或者PyCharm里自动补全出来的那几十个蓝色名字。但真相是:Pyth…

作者头像 李华
网站建设 2026/8/25 16:42:18

渗透测试Nmap实战案例(内网资产探测与风险排查)

场景背景内网网段:192.168.10.0/24 任务:全面探测网络资产并排查潜在风险准备工作cd /d D:\pentestmkdir 192.168.10.0 2>nulcd /d D:\pentest\192.168.10.0echo Session Start: %date% %time% > session.log实战步骤(1)探…

作者头像 李华