最近我有个朋友面试遇到这个问题,答得比较写意,反而被认为是不够专业,这个问题吧,我把它浓缩一下,希望对找工作面试的朋友,有帮助。
上面这个代码,a是整形变量,b是整形引用,c是整形指针。
从上面这个gdb过程,可以看出
1)引用类型的变量,是所引用变量的一个别名。
2)指针类型的变量,本身是一个地址,这个地址上存放的值,才是指向地址的值
例如先后对a,赋值0,1,2
然后查看该地址的存放的值,也均发生了变化,也就是说p的地址0x7fffffffe40c不变,但地址上存放的值变了,即p不变,*p变了。
在实战中主要区别在哪里呢?
I
1)引用类型的变量,一次引用,终生不能再引别人了,比如b引用了a,不能再引用XX了。
2)指针类型的变量,想怎么指,怎么指,这会指这里,那会指哪里,其实就是地址的修改,自由度大。
II
1)
引用类型的变量,放心,绝对不需要考虑释放的问题,也绝对不可能NULL,引用必有内容
2) 指针类型的变量,危险,要考虑释放的问题,有可能是NULL。
III
1) 在很多时候指针和引用可以相互替换,但引用更简洁,例如:
void funA( int *p)
{
*p = 1;
};
void funB(
int &p)
{
p =
1;
};
int main(void)
{
int a = 0;
funA(&a);
funB(a);
}
funA和funB的功用是相当的,但是可以感觉到引用更加自然。
再比如一个二维数组的引用和指针,也可感觉到引用更加自然。
typedef int aa_r_t [2][2];
typedef int aa_p_t [2];
int main(void)
{
int aa[2][2]={{0,1},{2,3}};
aa_r_t& pr = aa;
aa_p_t* pp = aa;
return 0;
}