指针类型的初始化或赋值,(不存在特例的情况下)对象类型都应该严格匹配
如下的初始化是或的关系,每次只存在一个初始化,因为方便比较
指向常量的指针可以初始化被同类型的常量和同类型非常量,因为是一个指针的特列,可以指向同类型非常量如下,如果要存放常量对象的地址,只能使用指向常量的指针
int i = 42;
const int h = 0;
double x = 3.0;
const int *b =&i ;//正确
const int *b =&h ;//正确
const int *b =&x ;//错误
常量指针初始化对象类型必须一致,*修饰符是声明符的一部分,所以在常量指针种,类型是 int ,:
int i = 42;
const int h = 0;
double x = 3.0;
int *const b =&i ;//正确
int *const b =&h ;//错误,h是const int 类型,不能赋值给常量指针int类型,因为不是特列且不匹配
int *const b =&x ;//错误,完全不匹配
指向常量的常量指针 *修饰符是声明符的一部分,所以类型是 const int ,但这类型有含有指向常量的意思(也就是含有指向常量的指针 这层意思)所以也允许被同类型非常量初始化如下:
int i = 42;
const int h = 0;
double x = 3.0;
const int *const b = &i;//正确,如描述所说 同类型非常量
const int *const b = &h;//正确同类型常量
const int *const b = &x;//错误
const的引用情况,首先引用的类型必须与其所引用的对象类型一直,但存在特列:初始化常量引用允许用任意表达式作为初始值:非常量对象,字面值,甚至一般表达式,如下:
int i = 42;
const int i1=60;
double a = 3.14;
const int &r1 = i;// 正确 同类型非常量
const int &r1 = i1// 正确 同类型常量
const int &r2 = 42;//正确,字面值
const int &r3 = r1*42;//正确,表达式
const int &r4 = a;//正确,任意非常量对象
int &r5 = i1; //普通引用,类型必须一致,不存在特列
用于声明引用的const都是 底层const;