引用和指针的区别和共性:
引用是一种更安全的指针
判断引用的写法可以先写成指针,在把右边的&挪到左边覆盖*
1.引用必须初始化,指针可以不初始化。
2.定义一个引用变量和定义一个指针变量在汇编指令上是一模一样的,在指令上都是通过指针来进行的(定义时把需要被引用的地址存下来,赋值时先拿到引用的地址,再解引用),所以要求右边的值必须要可以被取地址(比如引用一个数是不行的)。通过引用变量修改引用内存的值,和通过指针解引用修改指针指向内存的值,底层指令也是一样的。
3.引用只有一级引用,没有多级引用。
swap分别用指针和引用的写法
void swap(int *x,int *y){
int temp = *x;
*x = *y;
*y = temp;
}
void main(){
int a = 10;
int b = 20;
swap(&a,&b);
}
void swap(int &x,int &y){
int temp = x;
x = y;
y = temp;
}
void main(){
int a = 10;
int b = 20;
swap(a,b);//传给形参的还是地址
}
在汇编上没有任何区别
与数组的应用
int main(){
int array[5] = {};
int *p = array;
int (&q)[5] = array;//定义引用变量引用array
cout<<sizeof(array)<<endl;//20
cout<<sizeof(p)<<endl;//4
cout<<sizeof(q)<<endl;//20
}
左值引用和右值引用
左值:有内存,有名字,值可以修改
右值:没内存,没名字
int a = 10;
int &b = a;
C++11后提供了右值引用
int &&c = 10;
const int &d = 10;//加const就可以引用右值
//这两句指令是一样的,先把10这个值保存到临时量,再通过寄存器给到引用变量的内存
//不同之处在于d是常量不再能作为左值,而c可以修改它引用的临时量内存
int &e = c;//右值引用变量c本身是一个左值(有内存有名字,被引用不用生成临时量)
总结:
1.右值引用专门用来引用右值类型,指令上可以自动产生临时量,然后直接引用临时量
2.右值引用变量本身是一个左值,只能用左值引用来引用他
3.右值引用不能用来引用左值
引用和指针、const结合的一些场景
1.题目:写一句代码在内存的0x0018ff44处写一个4字节的10
int *p = (int*)0x0018ff44;
//如果需要加上引用,则
int const *&p = (int*)0x0018ff44;
//或
int *&&p = (int*)0x0018ff44;
int a = 10;
int *p = &a;
//判断下面这行的对错
const int *&q = p;
//是错的
//还原成指针的形式:const int **q = &p;二级指针必须两边都有const
//必须的还原成指针,不能直接去掉引用变成一级指针