什么是引用? 引用:给数据起别名
格式:数据类型 数据名 = &数据名;
代码语言:javascript复制#include <iostream>
using namespace std;
int main() {
int a = 10;
int &b = a;
cout << "a的值是:" << a<<endl;
cout << "b的值是:" << b << endl;
a = 11;
cout << "a的值是:" << a << endl;
cout << "b的值是:" << b << endl;
b = 12;
cout << "a的值是:" << a << endl;
cout << "b的值是:" << b << endl;
system("pause");
return 0;
}
输出:
b引用a,b和a指向相同的内存地址, 所以当其中一个变化,另一个的值也会进行相应的变化。
注意事项:
- 引用必须初始化; int &b;//错误,没被初始化
- 引用在初始化之后就不能够被改变了; int a = 10; int &b = a; int c = 20; b = c;//这里就是错误的。
引用做函数的参数:
作用:参数传递时,可以通过引用的技术让形参修饰实参。
优点:简化指针修改实参。
代码语言:javascript复制#include <iostream>
using namespace std;
//值传递
void swap1(int a, int b) {
int tmp = a;
a = b;
b = tmp;
}
//地址传递
void swap2(int* a, int* b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
//引用传递,形参可以修饰实参
//也就是&a,&b是a,b的别名
void swap3(int &a, int &b) {
int tmp = a;
a = b;
b = tmp;
}
int main() {
int a = 10;
int b = 20;
cout << "a的值是:" << a<<endl;
cout << "b的值是:" << b << endl;
swap1(a, b);
cout << "swap1之后a的值是:" << a << endl;
cout << "swap1之后b的值是:" << b << endl;
swap2(&a, &b);
cout << "swap2之后a的值是:" << a << endl;
cout << "swap2之后b的值是:" << b << endl;
swap3(a, b);
cout << "swap3之后a的值是:" << a << endl;
cout << "swap3之后b的值是:" << b << endl;
system("pause");
return 0;
}
输出:
不难发现,地址传递和引用传递均可以通过形参的改变而影响实参的值。
引用做函数的返回值:
代码语言:javascript复制#include<iostream>
using namespace std;
//不能返回局部变量的引用
int& func() {
int a = 10;
return a;
}
//函数的调用可以作为左值
int& func2() {
//静态变量,在所有程序结束后才释放
static int a = 10;
return a;
}
int main() {
int& res = func2();
cout << res << endl;
cout << res << endl;
func2() = 100;
//相当于都是变量a的引用
cout << res << endl;
cout << res << endl;
system("pause");
return 0;
}
输出:
一句话来说就是:一荣俱荣,一损俱损。
引用的本质:
本质:引用的本质在C 内部实现实际上是一个指针常量;
代码语言:javascript复制#include<iostream>
using namespace std;
//发现是引用,转换为int* const ref = &a;
void func(int &ref) {
ref = 100;//ref是引用,转换为*ref=100;
}
int main() {
int a = 10;
//自动转换成int* const ref = &a;指针常量是指向不可以更改,值可以更改
int& ref = a;
ref = 20;//内部发现ref是引用,自动转换成*ref=20;
cout << "a="<<a << endl;
cout <<"ref="<< ref << endl;
func(a);
cout << "a=" << a << endl;
cout << "ref=" << ref << endl;
system("pause");
return 0;
}
输出:
常量引用:
作用:用来修饰形参,防止误操作。
代码语言:javascript复制void func(const int &tmp) {
//tmp= 100;不合法了
}
nt a = 10;
const int* ref = a;//不合法,必须是引用一段合法的内存空间
const int* ref2 = 10;//合法