C++引用

认识引用

  • 引用的概念
  • 引用的特性
  • 引用做参数
  • 引用的底层实现方式

引用的概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
但是引用自身占用内存,引用也是一种变量。只不过和普通变量不一样。

void TestRef()
{
	int a = 10;
	int& ra = a;//<====定义引用类型
	printf("%p\n", &a);
	printf("%p\n", &ra);//两个输出的都是a的地址
	printf("%d\n", a);
	printf("%d\n", ra);//两个输出的都是a的值,10
 }

引用的特性

  1. 引用在定义时必须初始化
  2. 一个变量可以有多个引用
  3. 引用一旦引用一个实体,再不能引用其他实体
void TestRef()
{
	int a = 10;
	// int& ra;   // 该条语句编译时会出错	
	int& ra = a;
	int& rra = a;
	printf("%p  %p  %p\n", &a, &ra, &rra);  
 }

引用做参数

在C语言中我们要交换两个数是这样的

void swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}
int main()
{
	int x = 0;
	int y = 1;
	swap(&x, &y);
	return 0;
}

如果用引用作为参数的话就是这样的

void swap(int& a, int& b)
{
	int temp = a;
	a = b;
	b = temp;
}
int main()
{
	int x = 0;
	int y = 1;
	swap(x, y);
	return 0;
}

为什么可以这样操作呢?

引用的底层实现方式

下面内容为转载内容,原文链接:
链接: https://blog.csdn.net/K346K346/article/details/46805159

引用被称为变量的别名,它不能脱离被引用对象独立存在,这是在高级语言层面的概念和理解,并未揭示引用的实现方式。常见错误说法是“引用“自身不是一个变量,甚至编译器可以不为引用分配空间。
实际上,引用本身是一个变量,只不过这个变量的定义和使用与普通变量有显著的不同。为了解引用变量底层实现机制,考查如下代码:

int i = 5;
int &ri = i;
ri = 8;

在Visual Studio 2017环境的debug模式调试代码,反汇编查看源码对应的汇编代码的步骤是:调试->窗口->反汇编,即可得到如下原码对应的汇编代码:

int i=5;
00A013DE  mov        dword ptr [i],5    	//将文字常量5送入变量i
int &ri=i;
00A013E5  lea        eax,[i]  	 	    	//将变量i的地址送入寄存器eax
00A013E8  mov        dword ptr [ri],eax  	//将寄存器的内容(也就是变量i的地址)送入变量ri
ri=8;
00A013EB  mov        eax,dword ptr [ri]  	//将变量ri的值送入寄存器eax
00A013EE  mov        dword ptr [eax],8   	//将数值8送入以eax的内容为地址的单元中
return 0;
00A013F4  xor        eax,eax

在汇编代码中,ri 的数据类型为 dword。也就是说,ri 要在内存中占据 4 个字节的位置。所以,ri 的确是一个变量,它存放的是被引用对象的地址。
这也就是为什么引用做参数可以交换值的原因,因为本质还是在地址。更多详细内容可以查看原文链接。

你可能感兴趣的:(C++程序设计,c++,数据结构)