1、一般而言,&在 = 左边,表示引用;
&在 = 右边,表示取地址。
eg、int &rn = a;//rn为普通变量a引用,即为a的别名,共享内存,占同一个内存空间。
int* p = &a;//定义指针p并初始化为a的地址,即p指向a,其中a为普通变量(省略其定义)
2、引用必须也只能在声明的时候初始化,以后均不能把该引用作为其他变量名的别名。
3、野指针:指针p没有进行初始化---->此时指针p为野指针----->若此时对其内容进行赋值,会产生无法预料的情况,可能导致程序崩溃。
最好养成定义指针p就直接给他初始化,一定要避免野指针的出现!!!
4、 参数为指针引用型,如void swap(char *&x,char *&y){} 则传入函数的就是实参,不是形参!【引用直接在原内存地址上修改内容,可看成可以传出函数。】
如果参数不为指针引用,那么指针交换只能在swap中有效,无法带出函数体,因为在函数体中,函数栈会分配两个临时的指针变量分别指向两个指针参数,对实际的字符串无效。
如果参数采用二级指针,则同样可以传出函数,达到字符串交换的目的。
5、参数引用:
const float pi = 3.14f;
float f;//全局变量
float f1(float r){
f = r*r*pi;
return f;
}
float& f2(float r){
f = r*r*pi;
return f;
}
int main() {
float f1(float=5);//默认参数调用,其默认值为5
float f2(float=5);
float a=f1();//正确。
float& b=f1();//错误!!!在f1函数中,全局变量f的值会先赋给一个临时变量temp,然后建立这个变量的引用b。这里对临时变量进行引用会发生错误。【这个temp变量由编译器隐式建立】
float c=f2();//正确。返回的引用,没有隐式地建立临时变量,直接返回的是全局变量
float& d=f2();//正确。这种方法最节省内存,但要注意其有效期。
d += 1.0f;//d是全局变量的引用,所以改变的值为d和全局变量f
return 0
}
6、常量变量和常量引用
把const放在引用之前表示声明的是一个常量引用。不能使用常量引用修改引用的变量的值。
eg…(1)const int b = 10;
int &c = b;//错误!b已经声明为常量,而c为变量,不可进行赋值。
(2)int a = 7;
const int &d = a;
d++;//错误!d是常量引用,不能对其进行自加等操作。
即【1】对于常量类型的变量,其引用也必须是常量类型的。
【2】对于非常量类型的变量,其引用可以是常量类型的,也可以是非常量类型的。
【3】无论什么时候,都不能使用常量引用修改其引用的变量的值。
简单的说,小范围 = 大范围;//正确
大范围 = 小范围;//错误