引用是什么
引用是某一个变量的别名,起到了一个标识作用,声明引用时必须对其初始化。
Type &别名 = 目标变量名
int a = 10;
int &b = a;//必须初始化
b = 200;//相当于把a的值修改成了200
printf("&d,%d\n",a,b);//200,200
a = 300;
printf("%d,%d\n",a,b);//300,300
int array[3]={1,2,3};
int (&ary)[3]=array;//对数组的引用
printf("%d,%d\n",&array[0],&ary[0]);//1,1
引用作为函数的参数
此时函数中对形参的各种操作实际上是对实参本身进行操作,而非简单的将实参变量或对象的值拷贝给形参。
//引用作为函数的参数时不用初始化
void Swap(int &a,int &b)//除了使用指针还可以使用引用
{
int temp = a;
a = b;
b = temp;
}
//main
int x = 10;
int y = 20;
Swap(x,y);
printf("%d,%d\n",x,y);// 20,10
struct Teacher
{
char name[10];
int age;
}
void Printf1(int *t1)
{
printf("%d\n",t->age);
}
void Printf2(int &t2)
{
printf("%d\n",t.age);
t.age = 30;
}
void Printf3(int t3)
{
printf("%d\n",t.age);
t.age = 28;
}
/main
Teacher t;
t.age = 25;
Printf1(&t);
Printf2(t);//引用
printf("%d\n",t.age);
Printf3(t);//t在这作为相残从在相当于 t = t;
printf("%d\n",t.age);
///
25
25
30
30
30
引用的本质
引用在C++中的内部实现是一个常量指针
Type& name <=> Type *const name
void Fun(int &a)
{
a = 100;
}
void Fun(int *const a)
{
*a = 100;
}
int main()
{
int x = 10;
func(x);
}
请仔细对比间接赋值成立的三个条件
1、定义两个变量 (一个实参一个形参)
2、建立关联 实参取地址传给形参
3、*p形参去间接的修改实参的值
结论
引用在实现上,只不过是把:间接赋值成立的三个条件的后两步和二为一
当实参传给形参引用的时候,只不过是c++编译器帮我们程序员手工取了一个实参地址,传给了形参引用(常量指针)