引用和指针
1. 引用概念
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间, 使用方式和普通变量相同, 当原变量来对待 。比如:李逵,在家称为"铁牛",江湖上人称"黑旋风"。
底层实现: 通过指针来实现,
2. 形式: 类型+& + 新名称 = 新值
void test(){
int a = 10;
int b = -1;
// ra引用, 是变量a的别名, a所代表的空间有两个名字, 代表还是原变量本身
int& ra = a;
ra = 20;// a 和 ra 都为 20
// 引用在定义之后就不会再改变指向了, 始终指向本体
int& rra = a;
rra = b; // a变为-1, 修改了值
}
注意: 引用类型必须和引用实体是同种类型的
3. 引用特性
- 引用在定义时必须初始化, 可以改变内容, 但是不能改变指向
- 一个变量可以有多个引用
- 引用一旦引用一个实体,再不能引用其他实体
void Test2()
{
int a = 10;
// int& ra; // 该条语句编译时会出错
int& ra = a;
int& rra = a;
printf("%p %p %p\n", &a, &ra, &rra);
}
引用相当于是一个const指针, 引用的底层就是通过指针来实现的, 指向的空间不能变, ==> 类型* const --> 指向在定义时确定, 不会变, 从一而终(int* const) --> const的指针
而 const 类型* const --> 表示内容和指向都不能变(const int* const a = 5;)
- 在指针前加const 指向不变
- 在类型前加const 内容不会
void test3(){
// 常引用: 常引用可以指向const变量, 常量, 临时变量
const int c = 30;
const int& rc = c;
//rc = 100; // const引用的内容不能变 --> 常引用
const int& r1 = 10