首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >指针和引用的区别是什么

指针和引用的区别是什么

作者头像
ClearSeve
发布2022-02-10 18:55:25
发布2022-02-10 18:55:25
52300
代码可运行
举报
文章被收录于专栏:ClearSeveClearSeve
运行总次数:0
代码可运行

问题

我知道引用是语法糖,用起来方便。但是它们之间到底有啥区别呢?

回答

  1. 指针可以改变其绑定的变量,也可以不用初始化(不建议这么做,有危险),
代码语言:javascript
代码运行次数:0
运行
复制
   int x = 5;
   int y = 6;
   int *p;
   p = &x;
   p = &y;
   *p = 10;
   assert(x == 5);
   assert(y == 10);
代码语言:javascript
代码运行次数:0
运行
复制
引用不可以,且必须初始化。
代码语言:javascript
代码运行次数:0
运行
复制
   int x = 5;
   int y = 6;
   int &r = x;
  1. 指针变量有自己的实际地址和所占空间的大小,x86 上一般是 32 位,但是引用是和它绑定的变量共享一个地址。 int x = 0; int &r = x; int *p = &x; int *p2 = &r; assert(p == p2);
  2. 指针可以指向指针的指针,指针的指针的指针,甚至更多层的指针,但引用只能有一层。 int x = 0; int y = 0; int *p = &x; int *q = &y; int **pp = &p; pp = &q; // *pp = q **pp = 4; assert(y == 4); assert(x == 0);
  3. 指针可以赋为 nullptr,但引用不能初始化为空。当然你也可以使用其他的方法(毕竟奇淫技巧多)来实现。 int *p = nullptr; int &r = nullptr; // compiling error int &r = *p; // likely no compiling error, especially if the nullptr is hidden behind a function call, yet it refers to a non-existent int at address 0
  4. 指针支持算术运算,比如一个指针数组,使用++就可以拿到下一个位置的指针,+4就可以拿到后面的第四个。
  5. 指针需要以*来取值,引用不用。指向结构体或类对象的指针,还可以以->来获取其内部的成员,引用则使用.
  6. 没有“引用数组”这种说法,只有“指针数组”。
  7. 常量引用可以绑定临时对象,也就是右值,指针不行,搞不好会段错误。 const int &x = int(12); // legal C++ int *y = &int(12); // illegal to dereference a temporary.
  8. 引用用于函数的参数和返回值,有的时候会很有用。比如参数const std::string& name,还有单例模式中的引用返回。

注意,C++ 标准并没有明确要求编译器该如何实现引用,但是基本上所有编译器在底层处理上都会把引用当作指针来处理。比如下面是一个引用,

代码语言:javascript
代码运行次数:0
运行
复制
int &ri = i;

如果未被编译器完全优化,那么它的底层实现其实就和指针一样,开辟一段内存,存放 i 的地址。可以参考,

另外附一些可能需要的链接,

  • My all-time favorite C++ FAQ lite
  • References vs. Pointers
  • An Introduction to References
  • References and const

来自: https://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer-variable-and-a-reference-variable-in

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年1月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 回答
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档