引用
引用
1. 概念
C++为了简化操作,对指针的操作进行了封装,产生了引用类型。引用类型实际上就是指针类型,只不过用于存放地址的内存空间对使用者而言是隐藏的。由于语法限制,导致在输出v2的时候,默认编译器有一个取*的操作,所以输出为值
2. 语法
int v1=10;
int &v2=v1;
int *v3=&v1;
3. 引用的性质
- 引用必须初始化
- 引用是一个限制的指针,但是引用不能游历内存,这使指针变得更安全
int v1 = 10;
int &v2 = v1;//引用是一个限制的指针,但是引用不能游历内存,这使指针变得更安全
int *v3 = &v1;
/*
00C51952 lea eax, [v1]
00C51955 mov dword ptr[v2], eax
int *v3 = &v1;
00C51958 lea eax, [v1]
00C5195B mov dword ptr[v3], eax
*/
_tprintf(_T("%p\r\n"),&v1);//输出v1的地址
_tprintf(_T("%p\r\n"), &v2);//输出v2里的值,也就是v1的地址
_tprintf(_T("%p\r\n"), v2);//输出*v3,即v1的值10
4. 得到引用地址
int v1 = 10;
int&v2 = v1;//v2存储的是v1的地址 v2是v1的指针
int*v3 = &v1;
int v4 = 100;
*(v3 - 3) = (int)&v4;//引用不能游历内存改变原有数据,但可以通过指针对原有数据进行改变,vs申请内存的特点是,变量与变量之间隔了八个字节(起到一个保护作用)
//所以这里是-3,因为栈区从下到上是由高到低,所以通过对其进行-3使到达v2的地址,用指针对数据进行改变
_tprintf(_T("%p\r\n"), &v1);//v1地址
_tprintf(_T("%p\r\n"), &v2);//v1地址
_tprintf(_T("%p\r\n"), v2);//100
5. 引用传参(更安全)
void Sub_1(int&ParameterData1, int&ParameterData2)
{
int v1 = ParameterData1;
ParameterData1 = ParameterData2;
ParameterData2 = v1;
}
6. 引用占内存吗?
引用是占内存的,为什么输出&v2的时候,输出的还是v1的地址而不是v2的地址呢,因为在输出的时候系统默认为取v2里的值,而不是取v2的地址
7. 引用的大小
虽然引用的本质上是指针,但是它的大小和指针有所区别,由于引用需要初始化,则引用在最开始的情况其中的内存就已经存在
8. 指针和引用的区别
1)引用是通过编译器实现寻址,而指针需要手动寻址;
2)引用需要立即初始化,指针初始化时间比较灵活
本文作者:修竹Kirakira
本文链接:https://www.cnblogs.com/XiuzhuKirakira/p/17084090.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步