跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ 引用vs 指针
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C++引用VS指针 = == 介绍 == 在C++中,'''引用'''(Reference)和'''指针'''(Pointer)都是间接访问变量的机制,但它们有不同的语法、行为和使用场景。理解它们的区别对于编写高效、安全的C++代码至关重要。 * '''引用'''是变量的别名,必须在声明时初始化,且不能重新绑定到其他变量。 * '''指针'''是一个存储内存地址的变量,可以重新指向不同的地址,也可以为`nullptr`。 == 基本语法对比 == === 引用 === <syntaxhighlight lang="cpp"> int x = 10; int& ref = x; // ref是x的引用 ref = 20; // 修改ref等同于修改x </syntaxhighlight> === 指针 === <syntaxhighlight lang="cpp"> int x = 10; int* ptr = &x; // ptr存储x的地址 *ptr = 20; // 通过指针修改x的值 ptr = nullptr; // 指针可以置空 </syntaxhighlight> == 关键区别 == {| class="wikitable" |+ 引用与指针对比 ! 特性 !! 引用 !! 指针 |- | 初始化 | 必须初始化 | 可以不初始化 |- | 可重新绑定 | 不能重新绑定 | 可以重新指向 |- | 空值 | 不能为`nullptr` | 可以为`nullptr` |- | 内存占用 | 通常不占用额外内存(编译器优化) | 占用指针大小的内存(如4/8字节) |- | 间接访问 | 自动解引用 | 需显式使用`*`或`->` |} == 内存模型 == <mermaid> flowchart LR subgraph 引用 A[x: 10] --> B[ref] end subgraph 指针 C[x: 10] --> D[ptr] --> C end </mermaid> == 实际应用场景 == === 函数参数传递 === 引用更安全,适合不需要重新绑定的场景: <syntaxhighlight lang="cpp"> void swap(int& a, int& b) { int temp = a; a = b; b = temp; } </syntaxhighlight> 指针更灵活,适合可能为空的场景: <syntaxhighlight lang="cpp"> void print(int* ptr) { if (ptr) cout << *ptr; // 检查空指针 } </syntaxhighlight> === 返回值优化 === 引用常用于运算符重载: <syntaxhighlight lang="cpp"> class Vector { int data[100]; public: int& operator[](size_t index) { return data[index]; } }; </syntaxhighlight> == 高级主题 == === 引用折叠(C++11) === 在模板和`auto`推导中涉及引用折叠规则: <math> \begin{align} T\&\ \&\ &\Rightarrow\ T\& \\ T\&\ \&\&\ &\Rightarrow\ T\& \\ T\&\&\ \&\ &\Rightarrow\ T\& \\ T\&\&\ \&\&\ &\Rightarrow\ T\&\& \end{align} </math> === 指针算术 === 指针支持算术运算,引用不支持: <syntaxhighlight lang="cpp"> int arr[3] = {1, 2, 3}; int* p = arr; p++; // 指向arr[1] </syntaxhighlight> == 性能考虑 == 在大多数情况下,引用和指针的底层实现相同,但引用: * 可能被编译器优化掉 * 没有空值检查开销 * 语法更简洁 == 总结 == * 优先使用引用:当不需要重新绑定/null语义时 * 必须使用指针:当需要动态内存管理或可选参数时 * 现代C++中,引用和智能指针(如`std::unique_ptr`)的组合可以替代许多原始指针的使用场景 [[Category:编程语言]] [[Category:C++]] [[Category:C++ 引用]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)