复合类型的声明
一条定义语句可能定义出不同类型的变量:
// i 是一个 int 型的数,p 是一个 int 型指针,r 是一个int 型引用
int i = 1024, *p = &i, &r = i;
错误观点:在定义语句中,类型修饰符(*或&)作用于本次定义的全部变量。造成这种错误看法的有个原因就是我们可以把空格写在类型修饰符和变量名中间:
int* p; //合法,但是容易产生误导
例如:
int* p1,P2; //p1 是指向 int 的指针,p2 是int 型
*仅仅是修饰了 p1 而已,对该声明语句中的其他变量,它并不产生任何作用。下列声明才能声明2个指针
int *p1, *p2; //p1 和 p2 都是指向 int 的指针
指向指针的引用
int i =42;
int *p;
int *&r = p; //r 是一个对指针 p 的引用
要理解 r 的类型到底是什么,最简单的办法是从右向左阅读 r 的定义。离变量名最近的符号(此例中是 &r 的符号 &) 对变量的类型有哦最直接的影响,因此 r 是一个引用。
默认状态下,const对象仅在文件内有效
如果想在多个文件之间共享 const 对象,必须在变量的定义之前添加 extern 关键字。
指针和 const
指针的类型必须与其所指对象的类型一致,但是有2个例外。
第一种例外情况是允许令一个指向常量的指针指向一个非常量对象:
double davl = 3.14; //dval 是一个双精度浮点数,它的值可以改变
const double *cptr = &dval; // 正确:但是不能通过 cptr 改变 dval 的值
把 * 放在 const 关键字之前用以说明指针是一个常量,这样的书写形式隐含着一辰意味,即不变的是指针本身的值而非指向的那个值。
指针和 constexpr
const int *p = nullptr; //指向整型常量的指针
constexpr int *q = nullptr; //指向整数的常量指针