1. 引用的基本语法:数据类型 &新变量名=原变量名。通过新变量名可以对原始值进行修改,因为两个名称指向的地址都相同。
2. 引用的注意事项:(1)引用必须初始化。(2)引用初始化之后,不可以再改变。(一旦被确定,不可以再修改)
3. 引用做函数参数:简化指针,用引用可以实现形参修饰实参。
//主函数中函数的调用,传参直接就是原始参数的名称
swap(a, b);
//交换函数
void swap(int& a, int& b){}
//注意这里的形参列表应该用引用的形式进行接收!!!
#include<iostream>
using namespace std;
//值传递
void swap1(int a, int b) {
int temp = b;
b = a;
a = temp;
cout << "值传递内部:\t" << a << " " << b << endl;
}
//地址传递
void swap2(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
cout << "地址传递内部:\t" << *a << " " << *b << endl;
}
//引用传递
//将原名赋值给引用,通过引用的修改,可以修改原值
void swap3(int& a, int& b) {
int temp = b;
b = a;
a = temp;
cout << "引用传递内部:\t" << a << " " << b << endl;
}
int main() {
int a = 3;
int b = 4;
cout << "原始数据:\t" << a << " " << b << endl;
swap1(a, b);
cout << "值传递外部:\t" << a << " " << b << endl;
swap2(&a, &b);
cout << "地址传递外部:\t" << a << " " << b << endl;
//重新赋值
a = 3;
b = 4;
cout << "赋值后的数据:\t" << a << " " << b << endl;
swap3(a, b);
cout << "引用传递外部:\t" << a << " " << b << endl;
system("pause");
return 0;
}
最后发现,用引用作为函数的形参列表,即使是值传递形式,也可以修改原值。
4. 引用做函数的返回值:(1)局部变量的引用不能作为函数返回值,原因与局部变量不能作为函数返回值一样,因为引用和本体是等效的,局部变量存放在栈区,函数执行完毕就会被销毁,因此不可以做为返回。(2)函数同样可以作为被赋值的左值,其中返回值是引用的函数就可以,相当于是将一个数赋值给了一个引用(同时赋值给了引用的本体)
#include<iostream>
using namespace std;
//1. 不可以返回局部变量(在函数内部生命的变量)的引用
//2. 函数的带哦用可以作为左值被赋值
int& test1() {
int a = 10;
//返回a没有意义,因为a的内容已经释放。和返回局部变量的原因一样,不可以返回局部变量。
return a;
}
int& test2() {
//静态变量全局区,在程序结束后才释放
static int a = 10;
//返回a没有意义,因为a的内容已经释放。和返回局部变量的原因一样,不可以返回局部变量。
return a;
}
int main() {
//倘若成立,此举等于int& ref = a;
int& ref = test1();
cout << ref << endl;
//再次运行就是乱码,因为编译器在第一次时做了保留。
cout << ref << endl;
int& ref2 = test2();
//不会出现问题
cout << ref2 << endl;
cout << ref2 << endl;
//作为函数左值
test2() = 100;
cout << ref2 << endl;
cout << ref2 << endl;
system("pause");
return 0;
}
第一次打印输出:
原因:
第二次输出:
原因:静态变量,即使函数执行完毕,也不会销毁。a一直等于10.
第三次输出:
原因:
简而言之,引用作为函数的参数还是比较方便,但是我依然喜欢用传地址指针接收的形式进行书写