引用(Reference)与指针(Pointer)

来源:互联网 发布:华为交换机端口acl 编辑:程序博客网 时间:2024/06/05 19:08

引用(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的值变为4ri = 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  

转载请注明转自

http://blog.csdn.net/u012606927/article/details/19043295

0 0
原创粉丝点击