一、引用和指针的区别?
- 引用是一种更安全的指针。引用是必须初始化的,指针可以不初始化。
- 引用只有一级引用,没有多级引用;指针可以有一级指针,也可以有多级指针。
- 定义一个引用变量,和定义一个指针变量,其汇编指令是一模一样的;通过引用变量修改所引用内存的值,和通过指针解引用修改指针指向的内存的值,其底层指令也是一模一样的。
- 引用的使用:
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
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
二、右值引用
- 右值引用是专门用来引用右值类型的。指令上,可以自动产生临时量,然后直接引用临时量。
- 右值引用变量本身是一个左值,只能用左值引用来引用它。
- 不能用一个右值引用变量,来引用一个左值。
int a = 10;
int &b = a;
std::cout << b << std::endl;
int &&c = 20;
std::cout << c << std::endl;
c = 30;
std::cout << c << std::endl;
int &d = c;
std::cout << d << std::endl;
const int &e = 20;
std::cout << e << std::endl;
三、const、指针、引用的结合使用
int *p1 = (int*)0x0018ff44;
int *const &p3 = (int*)0x0018ff64;
int *&&p4 = (int*)0x0018ff74;
std::cout << std::hex << p1 << std::endl;
std::cout << std::hex << p3 << std::endl;
std::cout << std::hex << p4 << std::endl;