很多面试题中和acm竞赛以及很多问题中都会遇到指针和引用的差别。
引用在内部存放的是对象的地址,有时候又称为别名。通过引用我们可以间接的操作对象,与指针类似但不需要指针的语法。
引用的主要用途是“为了描述函数的参数和返回值”,特别是运算符的重载。
与指针的区别:引用必须指向一个对象,因此引用声明时必须初始化,始终如一。
而且引用赋值和指针不同。
参数传递方式:
3种,值参数,引用参数,指针参数。
值参数:与传值形式参数对应的实际参数将在函数执行之前被复制给形式参数,函数运行结束时,形式参数所属数据类型的西沟函数负责释放该参数。返回时,形参不会复制到对应的实参。
由于传值调用需要一个对象的复制和释放的过程,这将影响程序的执行效率,特别是传递的对象很大时。更好的解决方案是传递常量引用参数(const &)
指针参数和引用参数其实都是传递对象的地址,而不是整个对象的复制品。他们只是用法不同。
指针参数需要复应用符(*)来指向对象,而引用参数性质类似于指针,用法却类似于值参数。由于指针可能非空,所以我们用之前要进行检查。
顺便提一下const
int const *var 指向常量的非常量指针,指针var可变,指向的值*var不变
int *const var与上面相反
int const *const var略
const左结合一下全解释
话不多说,最后附上一段代码,供大家思考:
#include "iostream"
using namespace std;
void swap(int *a,int *b){
int *p;
p=a;
a=b;
b=p;
}
void swapref(int &a,int &b){
int c;
c=a;
a=b;
b=c;
}
int main(){
int a=3,b=4;
int &af=a,&bf=b;
cout<<a<<" "<<b<<endl;
int *pa,*pb;
pa=&a;
pb=&b;
swap(&a,&b);
cout<<a<<" "<<b<<endl;
swap(a,b);
cout<<a<<" "<<b<<endl;
swap(&af,&bf);
cout<<a<<" "<<b<<endl;
swap(a,b);
cout<<a<<" "<<b<<endl;
return 0;
}