C/C++面试:引用和指针的使用场合

1059 篇文章 285 订阅

问:指针和引用作用都是间接引用其他对象。你如何决定何时使用指针,何时使用引用呢?

应该使用指针的场合

  • 有指向不存在对象的可能时:在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此,如果你使用一个变量时并让它指向一个对象,但是该对象在某些时候可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量
  • 需要在不同时刻指向不同对象时

否则,总应该使用引用

  • 打个比方。当你重载某个操作符时,应该使用引用(为了防止不必要的语义误解)。看个例子
vector<int> v(10);
v[5] = 10;  

//如果operator []返回一个指针,那么v[5]就必须写成`*v[5] = 10`,这会使v看起来像一个向量指针

注:引用指向空值将导致未定义行为,请一定不要写这样的代码。比如:

char *pc = 0;
char & rc = *pc;

问:引用和指针的区别

  • 因为引用可能会指向一个对象,因此,引用必须被初始化;而指针没有这样的限制
string &pc;  //错误,引用必须被初始化
string *pc;  //未初始化的指针。合法但是危险
  • 不存在指向空值的引用意味着使用引用的效率比指针要高,因为在使用引用之前不需要测试它的合法性。相反,指针应该总是被测试,防止其为空
void printfDouble(const double &d){
    cout << rd;
}

void printfDouble(const double *pd){
    if(pd){
        cout << *pd;
    }
}
  • 指针可以被重新赋值以指向另一个不同的对象,但是引用总是指向在初始化时被指定的对象,以后不能改变
#include <iostream>

int main(){
    std::string s1("Nancy");
    std::string s2("Clancy");
    std::string &rs = s1;
    std::string *rp = &s1;
    rs = s2;   // rs仍然引用s1,但是s1现在的值是”Clancy“
    rp = &rs; // ps 现在指向s2,s1没有改变
}

指针和引用都是一种内存概念,区别在于,指针是一个实体,引用只是一个别名

在程序编译时,会将指针和引用添加到符号表中。

  • 指针指向一块内存,指针的内容是所指向的内存的地址,在编译的时候,则是将“指针变量名-指针变量的地址”,所以说,指针包含的内容是可以改变的,允许拷贝和赋值,有const和非const的区别,甚至可以为空,sizeof指针得到的是指针类型的大小
  • 而引用只是一块内存的别名,在添加到符号表的时候,是将“引用变量名-引用对象的地址”添加的符号表中,符号表一经完成就不能改变,所以引用必须而且只能在定义时被绑定到一块内存上,后继不能更改,也不能为空,也没有const和非const的区别。

sizeof引用得到代表对象的大小,sizeof引用得到的是指针本身的大小。另外在参数传递中,指针需要被解引用之后才可以对对象进行操作,而直接对引用进行的修改会直接作用到引用对象上。
 

作为参数时也不同,传指针的实质是传值,传递的值是指针的地址;传引用的实质是传地址,传递的是变量的地址

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值