引用
1.1 变量名
变量名实质上是一段连续存储空间的别名,是一个标号(门牌号)
通过变量来申请并命名内存空间.
通过变量的名字可以使用存储空间.
问题:对一段连续的内存空间只能取一个别名吗?
1.2 引用的概念
变量名,本身是一段内存的引用,即别名(alias). 引用可以看作一个已定
义变量的别名。
引用的语法:Type& name = var;
用法如下:
#include <iostream>
using namespace std;
int main(void)
{
int a = 10; //c编译器分配4个字节内存, a内存空间的别名
int &b = a; //b就是a的别名a = 11; //直接赋值{
int *p = &a; *p = 12; cout << a <<endl; } b = 14; cout << "a = " <<a << ", b = " << b <<endl;
return 0;
}
1.3 规则
1 引用没有定义,是一种关系型声明。声明它和原有某一变量(实体)的关
系。故 而类型与原类型保持一致,且不分配内存。与被引用的变量有相同的地
址。
2 声明的时候必须初始化,一经声明,不可变更。
3 可对引用,再次引用。多次引用的结果,是某一变量具有多个别名。
4 &符号前有数据类型时,是引用。其它皆为取地址。
int main(void)
{
int a,b;
int &r = a;
int &r = b; //错误,不可更改原有的引⽤用关系
float &rr = b; //错误,引⽤用类型不匹配 cout<<&a<<&r<<endl; //变量与引⽤用具有相>同
的地址。
int &ra = r; //可对引⽤用更次引⽤用,表⽰示 a 变量有两个别名,分别是 r 和 ra
return 0;
}
1.4 引用作为函数参数
普通引用在声明时必须用其它的变量进行初始化,引用作为函数参数声
明时不进行初始化。
#include <iostream>
using namespace std;
struct Teacher
{
char name[64];
int age ;
};
void printfT(Teacher *pT)
{ cout<< pT-‐>age <<endl;
}
//pT是t1的别名 ,相当于修改了t1
void printfT2(Teacher &pT)
{ pT.age = 33; cout<<pT.age<<endl;
}
//pT和t1的是两个不同的变量
void printfT3(Teacher pT)
{ cout<<pT.age<<endl; pT.age = 45; //只会修改pT变量 ,不会修改t1变量
}
int main(void)
{ Teacher t1; t1.age = 35; printfT(&t1); printfT2(t1); //pT是t1的别名printf("t1.age:%d \n", t1.age); //33printfT3(t1) ;// pT是形参 ,t1 copy⼀一份数据 给pTprintf("t1.age:%d \n", t1.age); //33
return 0;
}