写在前面,引用的特点:
1、一个变量可取多个别名。
2、引用必须初始化。
3、引用只能在初始化的时候引用一次 ,不能更改为转而引用其他变量。
定义一个变量的引用语法:
类型名 &引用名=某变量名
例如:int n=4;
int &m=n;
一、基础引用(取别名)
void demo1()
{
int n=7;
int &r=n;
r=4;
printf("n=%d r=%d\n",n,r);
printf("n的地址=%p r的地址=%p\n",&n,&r);
n=5;
printf("n=%d r=%d",n,r);
}
void demo2()
{
int a=4,b=5;
int &r1=a;
int &r2=r1;
r2=10;
printf("a=%d r1=%d r2=%d\n",a,r1,r2);
r1=b;
printf("a=%d r1=%d r2=%d\n",a,r1,r2);
}
二、const引用
void demo3()
{
int d1 = 4;
const int & d2 = d1;
d1 = 5;
printf("d1=%d d2=%d\n",d1,d2);
//d1改变,d2的值也会改变,不能给常量(不能被修改的量)赋值。
//d2不能重新赋值
const int d3 = 1;
const int & d4 = d3;
//int &d5 = d3;无法引用
const int & d6 = 5;//常量具有常性,只有常引用可以引用常量
printf("d1=%d d2=%d d3=%d d4=%d d6=%d\n",d1,d2,d3,d4,d6);
double d7 = 1.1;
//int& d8 = d7;
/*d7是double类型,d8是int,
d7赋值给d8时要生成一个临时变量,
也就是说d8引用的是这个带有常性的临时变量,所以不能赋值。*/
}
三、引用做参数
1.【值传递】如果形参为非引用的传值方式,则生成局部临时变量接收实参的值
void Swap (int a, int b)
{
int temp = a;
a = b ;
b = temp ;
}
/*值传递的方式无法实现交换,因为传参时对于参数a和b拷贝一临时副本,交换的是副本值,因为其是临时变量函数退出,变量销毁,并不会影响外部a和b的值。*/
2.【引用传递】如果形参为引用类型,则形参是实参的别名。
void Swap (int& a, int& b)
{
int temp = a;
b = a ;
a = temp ;
}
/*使用引用的话,不做临时拷贝,&的使用说明此处只是原参数的另一个名字而已,所以修改时直接在原参数的基础上修改变量值,减少了复制的开销,加快程序执行效率。*/
3.【指针传递】传入的说参数的地址
void Swap (int* pa, int* pb)
{
int temp = *pa;
*pa = *pb;
*pb = temp;
}
/*传入的是地址,因为地址是唯一的,所以指针通过地址的访问进而可修改其内容。*/