引用

引用

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)引用需要立即初始化,指针初始化时间比较灵活

posted @ 2023-02-01 20:33  修竹Kirakira  阅读(36)  评论(0编辑  收藏  举报