左值是可以放在等号左边被赋值的值
右值是在赋值号右边取出值赋给其他变量的值
左值必须在要在内存有实体,右值可以在内存也可以在寄存器
一个&代表引用左值,两个&代表引用右值
右值引用用于对象拷贝,直接从寄存器里拷贝,不需要在内存中建立副本—内存优化
#include <iostream>
#include <stdlib.h>
using namespace std;
/*
左值是可以放在等号左边被赋值的值
右值是在赋值号右边取出值赋给其他变量的值
左值必须在要在内存有实体,右值可以在内存也可以在寄存器
一个&代表引用左值,两个&代表引用右值
右值引用用于对象拷贝,直接从寄存器里拷贝,不需要在内存中建立副本---内存优化
*/
void main1()
{
//a b 是左值,在内存
int a = 5;
int b;
cout << &a << " " << &b << endl;
//a+1 和b+1是右值,在寄存器
b = a + 1;
b = a + 3;
}
void main2()
{
int a = 5;
int &ra = a; //引用必须初始化
ra = 3;
cout << a << endl;
}
void main3()
{
int num1 = 5;
int num2 = 10;
int* pnum = &num1;
int* &rpnum = pnum; //面向指针的引用
rpnum = &num2;//可以改变指针的指向
*rpnum = 100;//也可以改变指针指向的值
cout << &rpnum << " "<< rpnum << " " << *pnum << num2 << endl;
}
void main4()
{
int num1 = 5;
int num2 = 10;
int* p;
cout << &num1 << " " << &num2 << endl;
p = &num1; //&num1在寄存器
//p1 = &num2;
int* &&rpnum = &num1; //一个&代表引用左值,两个&代表引用右值
int* p1 = rpnum; //用于对象拷贝,直接从寄存器里拷贝,不需要在内存中建立副本
}
int & get()
{
int a = 10; //a在栈上
int &ra = a;
cout << &a << endl;
return ra;
}
void main5()
{
int & ra = get();
cout << ra << endl; //10
cout << "abcde" << endl; //栈上的空间被回收重新分配
cout << ra << endl; //值已经改变
}
int* & getdata()
{
int *p = new int; //p在栈上,但是指向的内存空间在堆上
*p = 10;
int* & rp = p; //引用指针
return rp; //返回引用的指针
}
void main()
{
int* &rp = getdata();
int* p = rp; //创建一个指针,保留堆上的地址
cout << *rp << endl;//10
cout << *p << endl; //10
cout << *rp << endl;//值发生变化
cout << *p << endl;//10
delete(p); //c++删除内存后,禁止访问
cout << *p << endl;
}