1.在C语言中,使用指针(Pointer)可以间接获取、修改某个变量的值
2.在C++中,使用引用(Reference)可以起到跟指针类似的功能
3. 注意点
3.1.引用相当于是变量的别名(基本数据类型、枚举、结构体、类、指针、数组等,都可以有引用)
3.2.对引用做计算,就是对引用所指向的变量做计算
3.3.在定义的时候就必须初始化,一旦指向了某个变量,就不可以再改变,“从一而终”
3.4.可以利用引用初始化另一个引用,相当于某个变量的多个别名
3.5.不存在【引用的引用、指向引用的指针、引用数组】
4.引用存在的价值之一:比指针更安全、函数返回值可以被赋值
#include <iostream>
using namespace std;
void test() {
int age = 10;
int height = 20;
// 定义了一个age的引用,ref相当于是age的别名
int &ref = age;
int &ref1 = ref;
int &ref2 = ref1;
ref += 10;
ref1 += 10;
ref2 += 10;
cout << age << endl;
}
//void swap(int *v1, int *v2) {
// int tmp = *v1;
// *v1 = *v2;
// *v2 = tmp;
//}
void swap(int &v1, int &v2) {
int tmp = v1;
v1 = v2;
v2 = tmp;
}
void test2() {
int a = 10;
int b = 20;
// swap(&a, &b);
swap(a, b);
cout << "a = " << a << ", b = " << b << endl;
int c = 2;
int d = 3;
swap(c, d);
cout << "c = " << c << ", d = " << d << endl;
}
一个引用占用一个同类型指针的大小
//struct Student {
// int &age;8byte
// int *age;8byte
//};
// x86: 32bit
// x64: 64bit
int main() {
// cout << sizeof(Student) << endl;
int age = 10;
// *p就是age的别名
int *p = &age;
*p = 30;
// ref就是age的别名
int &ref = age;
ref = 30;
int a = 3;
int b = a + 1;
getchar();
return 0;
}
5.引用的本质就是指针,只是编译器削弱了它的功能,所以引用就是弱化了的指针
int a = 10;
00901FE2 mov dword ptr [ebp-0Ch],0Ah
int *p = &a;
00901FE9 lea eax,[ebp-0Ch]
00901FEC mov dword ptr [ebp-18h],eax
*p = 20;
00901FEF mov eax,dword ptr [ebp-18h]
00901FF2 mov dword ptr [eax],14h
int a = 10;
00D41FE2 mov dword ptr [ebp-0Ch],0Ah
int &ref = a;
00D41FE9 lea eax,[ebp-0Ch]
00D41FEC mov dword ptr [ebp-18h],eax
ref = 20;
00D41FEF mov eax,dword ptr [ebp-18h]
00D41FF2 mov dword ptr [eax],14h
- 一个引用占用一个指针的大小