引用是变量的别名,必须初始化且不可改绑;指针是存储地址的变量,可为空、可重指向、可算术运算;引用必有效无需检查,指针使用前需判空。
引用是变量的别名,指针是存储地址的变量;引用必须初始化且不能改绑,指针可为空、可重指向、可算术运算。
引用在定义时必须绑定到一个已存在的对象,之后不能再绑定其他对象;指针可以先声明,后赋值,也可以为空(nullptr)。
例如:
int a = 10, b = 20; int& ref = a; // ✅ 合法:引用必须初始化,且绑定到a // int& ref2; // ❌ 错误:引用不能不初始化 // ref = b; // ⚠️ 注意:这其实是给a赋值为20,不是让ref改绑到b!int* ptr; // ✅ 合法:指针可以先声明 ptr = &a; // ✅ 后续赋值 ptr = &b; // ✅ 可以重新指向其他变量 ptr = nullptr; // ✅ 可以为空
引用一旦创建就一定有效(不存在“空引用”),所以用引用前无需检查;指针可能为空或野指针,使用前通常需要判空。
立即学习“C++免费学习笔记(深入)”;
例如:
void func(int& x) {
std::cout << x; // ✅ 安全:x一定有效
}
void func_ptr(int p) {
if (p != nullptr) { // ✅ 推荐:避免解引用空指针
std::cout << p;
}
}
引用本身不占额外存储空间(编译器通常优化为直接访问原变量),而指针是一个变量,占4或8字节;指针支持算术运算(如ptr++),引用不支持。
例如:
int arr[] = {1, 2, 3};
int& r = arr[0]; // r是arr[0]的别名
// r++; // ✅ 等价于 arr[0]++
// r += 2; // ✅ 合法,修改arr[0]
int* p = arr;
p++; // ✅ 指向arr[1]
// r++; // ❌ 但r本身不能++(不是指针)
引用常用于避免拷贝、实现输出参数或重载操作符;指针更灵活,适合表示可选、动态或数组场景。
例如:
// 引用参数:避免拷贝大对象,且能修改实参
void swap_ref(int& a, int& b) {
int t = a; a = b; b = t;
}
// 指针参数:可表示“不提供”(传nullp
tr)
void process(int opt_data) {
if (opt_data) { / 处理数据 */ }
}
// 引用返回:返回局部静态或成员,安全;不能返回局部栈变量的引用
int& get_first(std::vector& v) {
return v[0]; // ✅ 安全:v的生命期由调用者管理
}
// 指针返回:同样常见,但调用方需注意空值和生命周期
int find(int begin, int end, int val) {
while (begin != end && begin != val) ++begin;
return begin; // ✅ 可能返回end(即nullptr-like)
}
基本上就这些。核心记住:引用是“另一个名字”,指针是“地址值”。选哪个,看你要不要空状态、要不要重定向、要不要算术移动——要,就用指针;只要安全、简洁地访问或修改原对象,优先用引用。
# c++
# 区别
# 指针
# 输出参数
# 对象
# 为空
# 绑定
# 要不要
# 是一个
# 也可
# 看你
# 不存在
# 不支持
# 可选
# 就用
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Win11怎么更改系统语言_Win11中文语言包下载与安装【指南】
Win11如何设置电源计划_Win11电源计划优化教程【攻略】
Linux如何使用grep搜索文件内容_Linux下正则表达式匹配与查找技巧【指南】
c# 在ASP.NET Core中管理和取消后台任务
c++怎么使用std::unique实现去重_c++ 容器元素排序与连续重复删除【教程】
Win11怎么关闭通知中心_Windows11系统通知与专注助手设置
如何关闭Win10自动更新更新_Win10系统自动更新双重关闭技巧
php订单日志怎么导出excel_php导出订单日志到表格教程【教程】
如何使用正则表达式批量替换重复的“-”模式为固定字符串
Win11怎么关闭系统声音_Win11系统提示音静音设置【详解】
如何使用Golang编写单元测试_创建Test函数验证业务逻辑
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
Windows10任务栏图标变成白色文件_Win10重建图标缓存修复方法
Win10怎样卸载iTunes_Win10卸载iTunes步骤【步骤】
Win11怎么更改管理员名字 Win11修改账户名称详细步骤【教程】
零基础学会Python自动化办公_高效处理Excel与PDF文档
c++的位运算怎么用 与、或、异或、移位操作详解【底层知识】
c++ unordered_map怎么用 c++哈希表用法【教程】
电脑无法识别U盘怎么办 Windows磁盘管理与驱动更新修复识别问题【解决】
Python字符串处理进阶_切片方法解析【指导】
Windows蓝屏错误0x0000002C怎么解决_系统IO异常排查方法
c++如何使用std::bitset进行位图算法_c++ 快速查找与大规模数据排重【方法】
Mac如何与安卓手机传文件_Mac和Android设备互通【必备工具】
Windows如何设置登录时的欢迎屏幕背景?(锁屏界面)
Windows10电脑怎么设置防火墙出站规则_Win10禁止程序联网教程
Win11怎么关闭自动调节亮度 Win11禁用内容自适应亮度【设置】
Laravel 查询 JSON 列:高效筛选包含数组中任意值的记录
c++输入输出流 c++ cin与cout格式化输出【方法】
如何在 Go 结构体中正确初始化 map 字段
php中$this和::能混用吗_对象与静态作用域冲突解决【方法】
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
mac怎么安装adb_MAC配置Android ADB开发环境【详解】
Win11如何设置自动关机 Win11定时关机命令使用教程【技巧】
Win11视频默认播放器怎么改_Win11关联第三方播放器【步骤】
获取 PHP 文件最后修改时间的正确方法
Win11怎么设置按流量计费_Win11限制后台流量消耗【网络】
Python邮件系统自动化教程_批量发送解析与模板应用
如何在Golang中编写端到端测试_Golang E2E测试流程示例
Win11怎么清理C盘系统日志_Win11清理系统日志文件【步骤】
PythonPandas数据分析项目教程_时间序列透视表应用
C#如何在一个XML文件中查找并替换文本内容
Win11时间怎么同步到原子钟 Win11高精度时间同步设置【指南】
Mac如何修复应用程序权限问题_Mac磁盘工具修复权限【教程】
Windows10如何更改系统字体大小_Win10辅助功能文本缩放设置
php做exe支持多线程吗_并发处理实现方式【详解】
Mac如何开启夜览模式_Mac护眼模式设置与定时
如何用正则与预处理高效拦截带干扰符的恶意域名
微信企业付款回调PHP怎么接收_处理企业付款异步通知数据教程【教程】
如何使用Golang配置安全开发环境_防止敏感信息泄露
PHP主流架构怎么部署到Docker_容器化流程【操作】
2026-01-02
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。