引用(Reference)与指针(Pointer)
[声明与初始化]
与pointer类似,reference也是一个对象(object),可以用来间接指向另一个对象。reference的声明与pointer的声明的实质语法结构是相同的。不同的是,声明pointer的时候使用星号操作符*,而声明reference的时候使用地址操作符&。
int i = 3;
int *pi = &i;//声明 pi 为一个指针类型的对象,并且是一个”指向int整型的指针”,它的初始值为对象i的地址。
int &ri = i;//声明 ri为一个reference类型的对象,并且也是一个指向整型的reference,它指向的是i。
[最大的不同]
Pointer 和reference的最大不同是:pointer必须使用一个星号操作符*进行解引用操作,而reference不需要任何操作符,这里可以将reference看成是一个高级的指针。
下面通过内存的存储形式来理解这一点。
*p = 4; //使用pointer将i的值变为4
ri = 4; //使用reference 将i的值变为4 。
[内存中存储形式]
[其他的不同之处]
1 指针变量能够可以被重新赋值很多次,但是引用不可以,引用一旦初始化赋值后就不可以再对其重新赋值,有点像常量指针。引用一般被理解为对某个变量其别名。对引用的操作与对应变量的操作的效果完全一样。如果再将该别名与另外一个变量联系在一起,就会出现一个名字(别名)对应两个变量,很明显这不正确。
简而言之,一个pointer在它的有生之年可以指向许多不同的对象,而一个reference只能够指向一个对象。所以,一个reference就必须在一出生就被绑定。否则这个reference就永远不能被绑定到任何东西,也就毫无用处了。
int &ri = i;//将 ri 绑定到 i 。然后下面的赋值:
ri = j;//并不是把 ri 绑定到 j ,而是将 j 中的值赋给 ri 指向的对象,也就是赋给 i 。
2 一个有效的reference必须指向一个对象;而一个指针不需要,例如NULL指针不指向任何位置。
这点在应用中十分广泛,当你想要确信一个参数必须指向一个对象的时候,应该使用reference作为参数类型。 例如,交换函数(swap function),它接受两个int参数,并将两个参数的数值对调,如下所示:
int i, j;
swap(i, j);
而将原本在i中的值放到j中, 并将原本在j中的值放到i中。我们可以这样写这个函数:
void swap(int *v1, int *v2)
{
int temp = *v1;
*v1 = *v2;
*v2 = temp;
}
这种定义下,函数要像这样被调用: swap(&i, &j);
[参考文献]
http://www.prglab.com/blog/p/28
转载请注明转自