一、基础语法
引用,简单来说就是起个别名,通过不同的变量名指向同一个内存,读取同一个数据。本质上来说,是个指针常量(类似int* const b = &a)。基础语法如下:
int a = 10;
int& b = a;
与int c = a不同的是,这个方法会单独开辟一个新的内存空间,用于存储c的数据,但是引用方法不会。因此,对引用方法创建的新变量名b进行修改数据(类似 *b = 20),会使得a 的数据也进行更改。但是对c进行修改数据,对a没有影响。
int a = 10;
int& b = a;
int c = a;
b = 20;
c = 30;
cout << a; //输出结果a = 20
或者更直观的感受,直接输出&a,&b,会发现两者的地址完全一样。
注意事项:
- 创建引用的时候必须初始化 即,写成int &b;是错误的。
- 引用初始化后不可以在更改 即,写成int &b = a; &b = c;是错误的。
- 初始化不能直接赋值,必须是指向内存空间 即,写成int &b = 10;是错误的
- 加上常量后可以初始化赋值 即,写成const int &b = 10;是正确的。(编译器中自动转换成int temp = 10; const int &b = temp;)
二、引用做函数参数
以指针(地址)为形参传递时,可以对实参进行修改,因此下述代码可以将a和b的值进行交换。
#include<bits/stdc++.h>
using namespace std;
void swap_p(int* p1, int* p2) {
int temp = *p2;
*p2 = *p1;
*p1 = temp;
}
int main() {
int a = 10, b = 20;
swap_p(&a, &b);
cout << a << " " << b << endl;
return 0;
}
以引用为形参传递时,效果和地址传递几乎一样。
#include<bits/stdc++.h>
using namespace std;
void swap_y(int& y1, int& y2) {
int temp = y2;
y2 = y1;
y1 = temp;
}
int main() {
int a = 10, b = 20;
swap_y(a, b);
cout << a << " " << b << endl;
return 0;
}
可以用常量const 修饰,防止误操作。
const int &r = 10;
void func(const int& r) {
//防止出现 r = 20; 等语句使得a被更改
cout<<r<<endl;
}
int main(){
int a = 10;
func(a)
}
三、引用做函数返回值
注意事项:
- 不能返回局部变量的引用 类似返回栈区数据的地址,函数调用结束后内存释放导致错误
- 函数调用可以作为左值
#include<bits/stdc++.h>
using namespace std;
int& test() {
static int a = 10; //静态变量存放在全局区
return a;
}
int main() {
int& r = test(); //test()是a的别名,r是test()的别名,所以r也指向了a
cout << r << endl;
test() = 1000; //相当于 a = 1000
cout << r << endl;
return 0;
}