引用 :
- 引用是变量的别名
- 引用必须初始化
int a = 10;
int &b = a;
- b跟a就绑定起来了,改变a就是改变b,同理,改变b就是改变a
- &符号其实就是取地址符号,含义只有这一个。
*符号就是创建一个指针,或者是做一次地址跳转
int a = 10; // 给a分配一个内存逻辑地址0x100001, 这个地址存放了值10;
int *p = &a; //创建变量p, 给p分配地址0x100002, 这个地址存放的值是"0x100001"(a的逻辑地址值);
int *&q = p; //创建变量q, 给q分配地址也是0x100002, 因此这个地址存放的值还是a的逻辑地址值; q是p的别名。
*q = 20; //访问存放在q变量地址下的值, 获得了a的地址值, 再访问一下a的地址值, 修改上面的内容为20;
我们回顾一下指针作函数参数时:
void fun(int *a, int *b)
{
int c = 0;
c = *a;
*a = *b;
*b = c;
}
int x = 10, y = 20;
fun(&x, &y)
如果我们将 引用作函数参数
void fun(int &a, int &b)
{
int c = 0;
c = a;
a = b;
b = c;
}
int x = 10, y = 20;
fun(x,y)
这样输入参数就会特别简洁。其中a是x的别名,b是y的别名。
const 与指针类型
int x = 3;
const int* p = &x;
p = &x; //正确
//*p被定义为常量,故*y = 4将会报错
*p = 4; //错误
const int x = 3; int y = &x; //可变指针指向不可变变量,可以通过修改y的值来改变x,对于计算机来说是有风险的 ,所以错误
int x = 3; const int *y = &x; //不可变指针指向可变变量,权限小的接收一个权限大的,是被编译器允许的;但是不允许权限大的去接收一个权限小的
int const count = 3;
const int * p = &count; //正确
int* const p = &count; //错误
const int* const p = &count; //正确
指针指向const修饰的变量时,应该是const int const *p = &a;