引用
引用和指针的区别
-
引用是一种更安全的指针。
-
引用必须初始化,指针可以不初始化。引用初始化为另一个同类变量,特殊情况下可初始化为常量。
-
引用只有一级,没有多级引用。
-
从汇编指令层面看。对引用的处理,是采用指针的方法。因为引用是一种const指针。通过引用变量修改所引用内存的值,与通过指针解引用修改指针指向内存的值,二者的底层指令也是一样的。
-
数组如何被引用?
int a; int *b = &a; int &b = a; int array[5]; int (*p)[5] = &array int (&p)[5] = array
-
引用虽然本质是指针,但使用时,总是要先进行解引用,因此进行sizeof运算,依然为所引用变量的字节数。
左值引用和右值引用
- 左值:有内存,有名字,值是可以修改的。
- 右值:反之。
- C++11提供了右值引用:右值引用也必须立即进行初始化操作,且只能使用右值进行初始化。右值引用可以修改右值。
- 右值引用专门引用右值,不能引用左值。
- 右值引用变量本身是一个左值,只能用左值引用引用它。
- 指令上,自动产生临时量,然后直接引用临时量。
//一般情况下,C++只允许左值引用,而不允许右值引用 int num = 10; const int &b = num; //正确 const int &c = 10; //错误 //右值引用 int num = 10; //int && a = num; //右值引用不能初始化为左值 int && a = 10; //指令层面,临时量xx=20,然后a引用xx a = 11; //右值引用可以修改右值
const,一级指针,引用的结合使用
为了观察赋值是否可行,可以先将引用换成指针的写法:引用号&修改为*,等式右侧加上取地址符&,然后比较等式两边的类型是否符合赋值规范。video
int main()
{
//int& p = 10 //错误
const int& p = 10; //正确,产生临时量,p是临时量的引用
int* const& q = (int*)0x0018ff44; //q是const修饰的int指针,不能写成const int* &q
}
int main()
{
int a = 1;
int* p = &a;
const int *& q = p;
//相当于const int ** q = &p; const int **和int **不能相互赋值。
return 0;
}