指针:指针是一个特殊的变量,它里面存储的的数值为内存里的一个地址,通过`*`访问内存地址所指向的值。使用场景上:适用于动态内存管理,实现复杂的数据结构(链表,树等)
引用:引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 适用于实现操作符重载,返回引用实现链式调用
相同点:
- 指针和引用都能间接的访问变量
- 支持多态
- 函数传参时避免拷贝
- 引用是指针的语法糖,在汇编层面引用通过指针实现(实际传入地址 )
不同点:
- 引用在概念上定义一个变量的别名,不占内存空间;指针存储一个变量的地址占,内存空间
- 引用在定义时必须初始化;指针没有要求
- 引用在初始化一个实体后,就不能在引用其他实体;而指针只要没有const修饰可以在任何时候指向任何一个同类型 实体
- 没有NULL引用(不需要检查),但有NULL指针(对指针操作时需要检查)
- 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占 4个字节)
- 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
- 指针有多级指针,但是引用没有多级引用
- 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
- 引用比指针使用起来相对更安全