指针 与 引用

来源:互联网 发布:php求素数 编辑:程序博客网 时间:2024/05/22 01:56
需要注意的是,引用是对象的别名,所以引用与对象必须有着相同的特性。如const属性等等。具体介绍如下。若已知:int a =0; int b=0;const int c =0;int *p;const int *q = &c;1. 普通变量的引用:int &d = a;(正确,定义一个变量a的应用d)。int *&d = p;(正确,定义一个指针的引用d)。2. 常量的应用:第一种形式:int &d = c;(错误,因为c已知为一个常量,则其引用也必须为常量)。const int &d = c;(正确)。const int *&r = p;(错误,一个非const型的指针定义了一个const型的引用)。const int *&r = q;(正确)。第二种形式:int &d = 10;(错误)。实际上,当表达式的右边是一个值时,编译器是这样做的,它先生成一个临时变量temp,再将10赋给temp,然后再将d定义为temp的引用。即:int temp = 10;int &d = temp;因为10是一个值,不能被修改,所以还要加上一个const来修饰。最后的结果是:int &const d = 10;(正确)。int *&r = &a;(错误)。这个表达式的意思是要定义一个变量a的地址的引用,变量a的地址值相当于一个常量,所以要加上const来修饰指针r。int * const &r = &a;(正确)。综合以上两种形式:如果要定义一个常量c的地址的引用,则应该是:const int *const &r = &c;(正确)。 总结:一种记忆方法是:如果表达式的右边是一个const修饰的变量,则其引用要用const &来修饰;如果表达式的右边是一个值(地址值)的话,则需要用&const(或*&const)来修饰,且如果该值是一个const变量的地址值,则需要用const*&const 来修饰。总之一句话:要始终保持引用和对象有着相同的特性。容易混淆的点:已知:int a =0;int &b = a;int c =1;b = c;误解:因为b是a的引用,由于b与a对应的唯一性,一旦b定义为a的引用,则b的值不能再修改,所以:b=c;是错误的。这个观点的错误之处在于混淆了引用的定义与赋值的区别,在定义了b为a的引用之后,b即代表着a,而表达式b=c;是一个赋值语句,相当于吧c的值赋给a,即:a=c;因此,该语句是没有错误的。