引用和指针的其他区别
1) 引用必须在定义时初始化,并且以后也要从一而终,不能再指向其他数据;而指针没有这个限制,指针在定义时不必赋值,以后也能指向任意数据。
2) 可以有 const 指针,但是没有 const 引用。也就是说,引用变量不能定义为下面的形式:
- int a = 20;
- int & const r = a;
因为 r 本来就不能改变指向,加上 const 是多此一举。
其实引用只是对指针进行了简单的封装,它的底层依然是通过指针实现的,引用占用的内存和指针占用的内存长度一样,在 32 位环境下是 4 个字节,在 64 位环境下是 8 个字节,之所以不能获取引用的地址,是因为编译器进行了内部转换。以下面的语句为例:
int a = 99;
int &r = a;
r = 18;
cout<<&r<<endl;
编译时会被转换成如下的形式:
int a = 99;
int *r = &a;
*r = 18;
cout<<r<<endl;
使用&r取地址时,编译器会对代码进行隐式的转换,使得代码输出的是 r 的内容(a 的地址),而不是 r 的地址,这就是为什么获取不到引用变量的地址的原因。也就是说,不是变量 r 不占用内存,而是编译器不让获取它的地址。
当引用作为函数参数时,也会有类似的转换。以下面的代码为例:
纯文本复制
//定义函数
void swap(int &r1, int &r2){
int temp = r1;
r1 = r2;
r2 = temp;
}
/调用函数
int num1 = 10, num2 = 20;
swap(num1, num2);
编译时会被转换成如下的形式:
//定义函数
void swap(int *r1, int *r2){
int temp = *r1;
*r1 = *r2;
*r2 = temp;
}
//调用函数
int num1 = 10, num2 = 20;
swap(&num1, &num2);
引用虽然是基于指针实现的,但它比指针更加易用,从上面的两个例子也可以看出来,通过指针获取数据时需要加*,书写麻烦,而引用不需要,它和普通变量的使用方式一样。
C++ 的发明人 Bjarne Stroustrup 也说过,他在 C++ 中引入引用的直接目的是为了让代码的书写更加漂亮,尤其是在运算符重载中,不借助引用有时候会使得运算符的使用很麻烦。
本文详细解析了C++中引用和指针的主要区别,包括引用必须在定义时初始化并固定指向,而指针则更为灵活。文章还探讨了引用的底层实现,即基于指针但提供更简洁的语法,以及引用在函数参数中的应用。
5334

被折叠的 条评论
为什么被折叠?



