(1)从语法概念上来讲:引用是一个变量的别名不开空间,指针存储的是一个变量的地址,要开空间。
(2)引用在定义时必须初始化,指针建议初始化,但语法上不是必须的。
(3)引用在初始化时引用一个对象后,就不能再引用其他对象;指针可以在不断地改变指向对象。
(4)引用可以直接访问指向对象,指针需要解引用才是访问指向对象。
(5)sizeof中含义不同,引用结果为引用类型的大小,但是指针始终是地址空间所占空间字节个数
(6)指针很容易出现空指针和野指针的问题,引用很少出现,引用相对于来说会相对来说更安全一些。
下面将基于指针传递和引用传递俩种方式进行比对:
引用传递:func内的X是关于外部变量n的引用,x和n是一个东西,改变x就等于改变n;所以n的值会成为10。基于此,我们发现引用传递的书写方式与值传递相同。
class A
{
public:
void func(int& x)
{
x = x + 10;
}
};
int main()
{
A a;
int n = 0;
a.func(n);
cout << "n=" << n << endl;
return 0;
}
指针传递:
class A
{
public:
void func(int* x)
{
(*x) = (*x) + 10;
}
};
int main()
{
A a;
int n = 0;
a.func(&n);
cout << "n=" << n << endl;
}
反汇编:
俩者进行反汇编后,进行对比后发现可知俩者的底层实现是一样的。
那么什么时候使用指针 什么时候使用引用呢?
“用适当的工具做恰如其分的工作”
如果只需要借用一下某个对象的“别名”,那么就用“引用”,而不要用指针,以免发生意外。
——引用于《高质量的c_c++编程》