以下知识学习自github.com/Light-City/…
c++中引用和指针都与内存地址相关,但是他们的特性与用法却不相同。引用的出现也在一定程度上解决在代码中指针“漫天飞”的情况。
指针
int a=1;
int b=2;
int *p; //指针的初始化可以为空
p=&a; //指针p指向a的地址
p=&b; //指针p转向b的地址,a的内容不变
引用
int a=1;
int b=2;
//int &ref; 引用初始化不能为空
int &ref=a; //引用ref相当于a的别名
ref=b; //注意:此时a的值变成b,但ref仍然指向a
虽然指针的初始化可以为空,但是此时指针为野指针。在代码中使用时要判断指针是否为空,容易出现错误。相反引用必须初始化的特性使得它比指针更安全,却在一定程度上比指针少了自由度。
性能差距
void byPointer(int* p) { *p = 42; }
void byReference(int& r) { r = 42; }
// 对应的汇编代码
byPointer(int*): byReference(int&):
movl $42, (%rdi) movl $42, (%rdi)
ret ret
// 完全相同的汇编指令!
在汇编中,二者几乎没有差距,都是绑定内存地址。
总结
在代码中,我们应大胆使用引用,这可以让我们的代码变得更加安全优雅。