指针是比较难理解的,所以就想出一个新的来代替指针,so,引用就诞生了。
一、引用
引用的定义:数据类型& 变量名;
注意:引用在定义时必须初始化,引用初始化之后不能改变其所指向的地址,但是可以改变指向地址的值。这个就和指针中的指针常量相似。
int a=9;
int& b=a;
int c=6;
b=c;//只是将c赋值给b
其实,引用就是指针常量
//引用的特性 引用其实就是指针常量
int& b = a; // 0020191D lea eax,[a]
// 00201920 mov dword ptr[b], eax
b = c; // 00201923 mov eax,dword ptr [b]
// 00201926 mov ecx, dword ptr[c]
// 00201929 mov dword ptr[eax], ecx
//指针常量
int* const d = &a; // 008F192B lea eax,[a]
// 008F192E mov dword ptr[d], eax
*d = c; // 008F1931 mov eax,dword ptr [d]
// 008F1934 mov ecx, dword ptr[c]
// 008F1937 mov dword ptr[eax], ecx
//可以看到引用和指针常量的反汇编码相同,所以引用就是指针常量
引用作为函数的参数,与指针的作用差不多
struct S {
int q, w, e, r, t, y, u, i, o, p;
};
void printS(S& s) { //引用作为函数参数时,和指针的作用差不多
cout << s.q << s.w << s.e << endl;
}
int main() {
S s = { 1,2,3,4,5,6,7,8,9,0 };
printS(s);
return 0;
}
引用作为函数的返回值,返回的是该值的地址,所以可以作为可修改的左值
int& getvalue(int arr[], int index) {
return arr[index];
}
int main() {
int arr[3] = { 1,2,3 };
getvalue(arr, 1) = 99; //当引用作为返回值时,返回的值为该值的地址,所以可以作为可修改的左值
cout << arr[1] << endl;
return 0;
}
指针引用
int main() {
int a = 9;
const int& b = a; //不可以修改
//引用=指针常量
//常量引用=常量指针常量
//指针引用
//还是一个引用,只是它指向的是一个指针
return 0;
}