2.3.1 引用
引用就是一个对象的别名,由于被引用的一定要是一个对象,而引用本身不是对象,所以不能定义引用的引用。
引用一定要在定义时就指定被引用对象。
引用的类型和被引用对象的类型一定要是相同的。
int i = 1024;
int &r = i;
double &r1 = i; //错误,i为int,而r1为double型,不相同,不对应
2.3.2 指针
空指针
对于空指针,有至少三种定义方法。
int *p = NULL; //NULL是预编译变量,在预编译时会被替换成0,等价于第二种方法。书中告诫要逐渐减少NULL的使用。
int *p = 0; //直接赋字面常量0
int *p = nullptr; //C++ 11 的新标准,以后用这个。
注意,虽然方法2可以直接赋0,但是不能用一个int变量赋值给指针,否则会报错。下面这样是报错误的,亲测。
#include <bits/stdc++.h>
using namespace std;
int main() {
int i = 0;
int *p = nullptr;
p = i;
if (p) cout<<"?"<<endl;
else cout<<"!"<<endl;
return 0;
}
书中提醒,指针初始化极其重要,如果不知道一个指针要被初始化成什么,就初始化成空指针。
无类型指针
void* pointers
无类型指针可以表示任何对象类型的地址。
嵌套指针
指针用一个*,指针的指针用**,指针的指针的指针用***,以此类推。
对于一个长变量定义的解释,要从右向左看。从右向左,距离越近的越直接影响这个变量。例如。
int *&r = p;
对于左边的定义部分,从右向左,先是引用声明符,说明r是个引用类型;再是指针声明符,说明r的引用类型是指针;再向左,则是int型指针。