1 引用
int &a = 10; //错误:引用类型的初始值必须是一个对象
double a = 3.14;
int &b = a; //错误:此处引用类型的初始值必须是int型对象
- 引用并非对象
- 引用必须初始化
- 引用只能和对象绑定在一起,而不能和字面值或计算表达式的结果绑定
- 引用类型严格匹配
2 指针
double dval;
double * pd = &dval; //正确
double * pd2 = pd; //正确
int * pi = pd; //错误:指针pi的类型和pd的类型不匹配
pi = &dval; //错误:试图把double型对象的地址赋给int型指针
- 指针本身就是对象
- 指针的类型要和它指向的对象严格匹配
3 常量引用
int i = 42;
const int &r1 = i; //正确:允许将const int & 绑定到一个普通int对象上
const int &r2 = 42; //正确
const int &r3 = r1 * 2; //正确
int &r4 = r1 * 2; //错误
double dval = 3.14;
const int &ri = dval; //正确
//等价于
const int temp = dval;
const int &ri = temp;
int i = 42;
int &r1 = i;
const int &r2 = i;
r1 = 0; //正确
r2 = 0; //错误
- 初始化常量引用时允许用任意表达式作为初始值
4常量指针
定义:又叫常指针,可以理解为常量的指针,也即这个是指针,但指向的是个常量 (这个常量是指针的值(地址),而不是地址指向的值) 。
int const* p; const int* p;
- 常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改;
- 常量指针可以被赋值为变量的地址,之所以叫常量指针,是限制了通过这个指针修改变量的值;
- 指针还可以指向别处,因为指针本身只是个变量,可以指向任意地址;
5 指针常量
定义:本质是一个常量,而用指针修饰它。指针常量的值是指针,这个值因为是常量,所以不能被赋值。
int* const p;
- 它是个常量!
- 指针所保存的地址可以改变,然而指针所指向的值却不可以改变;
- 指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化;
已经晕了。。
更多参考 菜鸟