C++的引用

一、引用和指针的区别?

  1. 引用是一种更安全的指针。引用是必须初始化的,指针可以不初始化。
  2. 引用只有一级引用,没有多级引用;指针可以有一级指针,也可以有多级指针。
  3. 定义一个引用变量,和定义一个指针变量,其汇编指令是一模一样的;通过引用变量修改所引用内存的值,和通过指针解引用修改指针指向的内存的值,其底层指令也是一模一样的。
  4. 引用的使用:
  • 一般使用
	int a = 10;
	int *p = &a;
	int &b = a;
	*p = 20; // a=20, *p=20, b=20
	b = 30; // a=30, *p=30, b=30
  • 交换函数swap
	void swap(int *x,int *y) {
		int temp = *x;
		*x = *y;
		*y = temp;
	}
	void swap(int &x,int &y) {
		int temp = x;
		x = y;
		y = temp;
	}
	int a = 10, b = 20;
	swap(&a, &b); // a = 20, b = 10
	swap(a, b); // a = 20, b = 10
  • 引用数组
	int array[5] = {};
	int *p = array;
	// 定义一个引用变量,来引用array数组
	int (&q)[5]= array; // 解引用,相当于int (*q)[5]= &array;
	int(*q1)[5] = &array; // q1是数组指针,仍然是一个指针
	std::cout << sizeof(array) << std::endl; // 20
	std::cout << sizeof(p) << std::endl; // 8
	std::cout << sizeof(q) << std::endl; // 20 
	std::cout << sizeof(q1) << std::endl; // 8

二、右值引用

  1. 右值引用是专门用来引用右值类型的。指令上,可以自动产生临时量,然后直接引用临时量。
  2. 右值引用变量本身是一个左值,只能用左值引用来引用它。
  3. 不能用一个右值引用变量,来引用一个左值。
	int a = 10; // a是左值,它有内存,有名字,值可以修改
	int &b = a;
	std::cout << b << std::endl; // 10

	//int &c= 20; // 20是右值,没内存,没名字
	//C++11提供了右值引用
	int &&c = 20;
	std::cout << c << std::endl; // 20

	c = 30;
	std::cout << c << std::endl; // 30

	int &d = c; // 一个右值引用变量,本身是一个左值
	std::cout << d << std::endl; // 30

	/*
	int temp = 20; 
	temp -> e
	*/
	const int &e = 20;
	std::cout << e << std::endl; // 20

三、const、指针、引用的结合使用

	// 写一句代码,在内存的0x0018ff44处写一个4字节的10
	int *p1 = (int*)0x0018ff44; // (int*)0x0018ff44是一个右值
	//int *&p2 = (int*)0x0018ff54; // 错误,非常量引用的初始值必须为左值
	int *const &p3 = (int*)0x0018ff64; // 引用变量是一个常量
	int *&&p4 = (int*)0x0018ff74; // 右值引用

	std::cout << std::hex << p1 << std::endl; // 000000000018FF44
	std::cout << std::hex << p3 << std::endl; // 000000000018FF64
	std::cout << std::hex << p4 << std::endl; // 000000000018FF74
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值