对于指针与引用的区别,我们首先谈一下引用的规则和三种使用方法。
引用的一些规则如下:
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
引用的三种使用方法;
1)独立引用
#include<iostream>
using namespace std;
int main()
{
int a=3;
int& b=a;//b与a绑定在一起,同生共死
cout<<b<<" "<<a<<endl;
b=5;
cout<<b<<" "<<a<<endl;
return 0;
}
2)作为函数参数
#include<iostream>
using namespace std;
void f(int& b)//b在这里与实参a无异
{
b++;
}
int main()
{
int a=3;
f(a);//a受函数体内部影响
cout<<a<<endl;
return 0;
}
3)作为函数的返回
#include<iostream>
using namespace std;
int& f(int* p)
{
(*p)++;
return *p;
}
int main()
{
int a=3,b;
b=f(&a)*5;
f(&a)+=10;
cout<<b<<" "<<a<<endl;//输出20与15
return 0;
}
//f函数返回一个(*p)的引用,即a的引用。此引用可作为左值进行运算。
指针与引用的相同点: 指针与引用看上去完全不同(指针用操作符‘*’和‘->’,引用使用操作符‘&’),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。
指针与引用的不同点:
1、要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。
不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。如所下的代码:
void printDouble(const double& rd)
{
cout << rd; // 不需要测试rd,它
} // 肯定指向一个double值
//相反,指针则应该总是被测试,防止其为空:
void printDouble(const double *pd)
{
if (pd)
{ // 检查是否为NULL
cout << *pd;
}
}
2、指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。
3、当重载某个操作符时,你应该使用引用。 当你不需要“重新指向”时,引用一般优先于指针被选用。这通常意味着引用用于类的公有接口时更有用。引用出现的典型场合是对象的表面,而指针用于对象内部。