c++中的指针和引用

20 阅读1分钟

# 指针VS引用

以下知识学习自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

// 完全相同的汇编指令!

在汇编中,二者几乎没有差距,都是绑定内存地址。

 

总结

在代码中,我们应大胆使用引用,这可以让我们的代码变得更加安全优雅。