#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
void test01()
{
//引用和指针的区别
//1. 引用必须初始化,定义指针可以不初始化,但这样可能会造成野指针或者空指针
//2. 引用值只有一级引用,没有多级引用;但指针除了有一级指针外,还有多级指针
//3. 定义一个引用变量和定义一个指针变量,其底层的汇编指令是一样的;通过引用变量修改所引用的内存的值和通过指针的解引用修改变量的值得汇编指令也是一样的
//int &a = 20; 代码错误, 20是一个不能取地址的值
//左值是可寻址的变量,有持久性;
//右值一般是不可寻址的常量,或在表达式求值过程中创建的无名临时对象,短暂性的。
//什么是左值和右值
//理解1:左值是有地址的,变量就是左值;右值没有地址,如数字1,它就是右值
//理解2:左值能出现在赋值语句左边与右边;右值只能出现在赋值语句右边,如函数返回值只能在赋值语句右边
//对于数组的引用:引用实际上相当于给数组arr起了一个别名,所以它的本质还是数组arr
int arr[5] = { };
int* p01 = arr; //这里p01就是数组名,就是数组的首地址
//int(*p01)[5] = &arr; //数组指针
int(&q01)[5] = arr;
cout << sizeof(arr) << endl;
cout << sizeof(p01) << endl;
cout << sizeof(q01) << endl;
}
void test02(int(&arr)[3])
{
//c++的数组类型是带有长度信息的,引用传递时如果指明是数组则必须指定长度
cout << arr[0] << " " << arr[1] << " " << arr[2] << endl;
}
void test03()
{
//左值引用
int a = 10;
int& b = a; //左值,有内存,有名字,值可以修改,不需要生成临时变量;
//右值引用
//int& c = 20; //错误,20是一个右值,没有地址,没有名字
int&& c = 20; //C++11以后的语法,此时c = 20;
//相当于这样:
//int temp = 20; 先定义一个临时变量
//int c = temp; 在将临时变量的值给c
c = 30;
int& e = c; //左值引用
cout << c << " " << e << endl;
}
int main()
{
test01();
int arr[3] = { 0, 1, 2 };
test02(arr);
test03();
return 0;
}
C++ 中左值和右值引用的讲解
最新推荐文章于 2023-12-23 18:58:11 发布