1. 基础概念
1.1 变量
当申明一个变量的时候,计算机会将指定的一块内存和变量名进行绑定;例如:下面的变量赋值语句,将5赋值到一块内存空间,这块内存空间的名字是x,这块内存的地址是0X001。
int val = 5;
变量在内存中的操作其实是需要经过2个步骤的:
- 找出与变量名相对应的内存地址。
- 根据找到的地址,取出该地址对应的内存空间里面的值进行操作。
1.2 指针
指针变量相对应的内存空间存储的值恰好是某块内存的地址。
int Val = 5;
int *Ptr = &Val;
通过这个符号(*),指针获取指针指向的内存空间中的值称为解引用。空指针不能解引用。
1.3 引用
引用是一种特殊的指针,是某块内存空间的别名,在使用的时候会自动解引用,而不需要指针那样显式解引用。
2. 指针与引用的区别
2.1 相同点
- 都是地址的概念,指针指向一块内存,它的内容是某块内存空间的地址;而引用则是某块内存空间的别名。指针是一个实体,而引用只是一个别名
2.2 不同点
- 引用定义时候必须初始化,指针可以为空
所以,指针必须做判空操作,而引用则不必 - 指针和引用的自增(++)运算意义不一样
- 引用初始化后,不可变,指针可变。
- “sizeof”
"sizeof引用"得到的是所指向饿变量的大小, “sizeof指针” 得到的是指针本身的大小 (4个字节) - 安全性
引用比指针更安全。由于不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,因此引用很安全。对于指针来说,它可以随时指向别的对象,并且可以不被初始化,或为NULL,所以不安全。
参考文章
https://blog.youkuaiyun.com/smartgps2008/article/details/90648015.
https://blog.youkuaiyun.com/smartgps2008/article/details/90648015.