Reference - ShenYj/ShenYj.github.io GitHub Wiki
在C语言中,使用指针(Pointer)可以间接获取、修改某个变量的值
在C++中,使用引用(Reference)可以起到跟指针类似的功能
-
示例
int age = 10; // 指针 *p就是age的别名 int *p = &age; *p = 30; // 引用 ref就是age的别名 int &ref = age; ref = 30;
/// 数组引用, 参考补充中的 数组指针 int array[] = { 1, 2, 3 }; int (&ref)[3] = array
/// 指针引用 ; 等于指针的别名 int age = 10; int *p = &age; int *&ref = p; *ref = 30; int height = 30; ref = &height;
- 引用相当于是变量的别名(基本数据类型、枚举、结构体、类、指针、数组等,都可以有引用)
- 对引用做计算,就是对引用所指向的变量做计算
- 在定义的时候就必须初始化,一旦指向了某个变量,就不可以在改变,“从一而终”
- 可以利用引用初始化另一个引用,相当于某个变量的多个别名
- 不存在【引用的引用、指向引用的指针、引用数组】
引用存在的价值之一: 比指针更安全、函数返回值可以被赋值
引用的本质就是指针,只是编译器削弱了它的功能,所以引用就是弱化了的指针
一个引用占用一个指针的大小
-
int *arr[3]
指针数组,可以存放3个指针元素的数组
-
int (*arr)[3]
数组指针,用于指向数组的指针, 数组放三个int类型元素
引用可以被 const 修饰, 这样就无法通过引用修改数据了,可以成为常引用
int age = 10;
const int &ref = age;
/// 编译错误
ref = 30;
int age = 10;
/// 引用的特性, 写不写效果一样
int & const ref = age;
/// 不会报错, 参考 指针常量 (能够赋值,不能改变指向)
ref = 30;
参考 const 修饰指针时的使用场景
总结:
-
const 必须写在 & 符号的左边,才能算是常引用
-
const 引用的缺点
-
可以指向临时数据(常量、表达式、函数返回值等)
/// 报错 int &ref = 30; /// 正常 const int &ref = 30;
/// 表达式 int a = 1; int b = 2; const int &ref = a + b;
int func() { return 10; } /// 函数返回值 int const &ref = func();
-
可以指向不同类型的数据
int age = 10; const double &ref = age;
-
作为函数参数时 (此规则也适用于 const 指针)
-
可以接受const和非const实参(非const引用,只能接受非const实参)
引用类型作为参数时默认只能传变量, 不支持常亮值的传递, 通过 const 修饰形参类型, 使函数支持传递变量(e.g.: a)和常量值(e.g.: 10)
-
可以跟非const引用构成重载
无法与非引用函数构成重载,编译会报错
-
当常引用指向了不同类型的数据时,会产生临时变量,即引用指向的并不是初始化时的那个变量
int age = 10; const long &ref = age; age = 30; /// 输出的值是 10 /// 通过汇编代码, 先将10复制给寄存器,然后将寄存器的值存在另外一段栈空间(临时变量), 重新给age赋值改变的是age所在栈空间的内容 cout << ref << endl;
如果相同类型,不会产生临时变量
-
-