c++ 指针和引用的区别

最近在看《c++语言的设计与演化》,对指针和引用有了全新的理解,决定写一篇博客记录一下。
指针很好理解,它本身拥有一个地址,地址中存着的是它指向的对象的地址。

int a = 3;
int* ptr = &a;

对于上面所定义变量a和指针ptr,ptr位于地址add1中,add1中存储的是a的地址。

引用是什么?简单的说,引用是别名,也就是其所指对象的第二名称,对引用的修改也就是对其引用对象的修改,从这意义上说,引用和指针很像(实际上对于很多编译器来说引用和指针的汇编是一样的!)。
那么为什么需要引入引用?或者说,引用和指针的区别有哪些?
我们知道,对于一个函数传参来说,一般来说有值传递和指针传递两种。

void func(T a); // 值传递
void func(T* ptr); // 指针传递

对于简单的类型用值传递是可接受的,但当面对复杂的类型时值传递需要调用相关的构造函数等操作,这是不可接受的,因此一般使用指针传递。
一般来说这就已经够用了,但当c++引入了运算符重载后,指针传递就显现出它的弊病了。

// 假设我们定义了运算符重载+,并使用指针传递
T* operator+(T* a, T* b);
T a, b;
&a + &b; // 很丑的写法
a + b; // 这是符合我们理解的写法,但要求a,b都是指针

这就是引用传递所要解决的问题,让运算符的操作更符合我们的直观感觉。

T& operator+(T& a, T& b);
a+b;

另一个不同之处在于引用是一个初始化后就无法修改引用对象的特性,正由于该特性,c++中不存在这样的表述:

T& a; // 错误
T* b; // 正确
T t1, t2;
T& c = t1; // c 是 t1的别名
c = t2; // t1 = t2
b = &t1; // b指向t1
b = &t2; // b指向t2

最后总结一下两者的异同:
相同点:两者都是用来实现对外部某块地址的控制。
不同点:指针可以修改其指向的地址(当不是const时),因此也可以不进行初始化,而引用必须进行初始化,且在初始化之后就不能变更其引用对象了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值