持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情
(欢迎大家关注我的微信公众号——控制工程研习,上面会分享很多我学习过程中总结的笔记。)
题目来自阿里C++面试题
主要区别
| 指针 | 引用 |
|---|---|
| 指针是一个变量,存储的是一个地址,指向内存的一个存储单元。 | 引用是原变量的一个别名,跟原来的变量实质上是同一个东西。 |
| 指针可以有多级int **p; // valid | 引用只能是一级int &&a; // invalid |
| 指针可以在定义的时候不初始化 | 引用必须在定义的时候初始化 |
| 指针可以指向NULL | 引用不可以为NULL |
| 指针初始化之后可以再改变 | 引用在初始化后就不可以再改变 |
| 自增运算表示指向下一个内存 | 引用自增运算相当于被引用的变量++ |
| 作为函数参数时需要检查是否为空void fun_p(int *p){ if (p == NULL) { // }} | 作为函数参数时不需要检查是否为空void fun_a(int &a){ // } |
| sizeof(指针)返回Type*类型的大小 | sizeof(引用)返回Type类型的大小 |
重点的区别:
从表面上看,引用和指针都非常相似,因为两者都用于让一个变量提供对另一个变量的访问。由于两者都提供了许多相同的功能,因此通常不清楚这些机制之间的区别。
指针:指针是保存另一个变量的内存地址的变量。指针需要使用 * 运算符取消引用,才能访问它指向的内存位置。
int val = 5;
//code//
int *p = &val;
引用:引用变量是别名,即已存在变量的另一个名称。引用(如指针)也是通过存储对象的地址来实现的。可以将引用视为具有自动间接寻址的常量指针(不要与指向常量值的指针混淆!),即编译器将为您应用 * 运算符。
int val = 52;
int &ref = val;