引用是C++里增加的一个特性,其实只需要把它理解成为一个特殊的指针即可,再说白了一点,就是引用实际上放的是内存地址,指针和引用的主要区别有:
1.在声明一个引用时,必须对其进行初始化,而指针则没有这个规则,它可以在任何时候初始化,这个比较好理解,在这不多说了.
int *a;
int &b = a; //编译器会报错
//再来看下面这个
int a;
int *b = &a;
int &c = *b; //编译器不会报错,由此可见,虽然追溯到最后的a也是没有被初始化的,但是c并不会去检查,只要他被初始化了编译器就认为正确.
//如果把上面这句
int &c = *b;
//改成
int &c = b; //编译器会报错说类型不匹配,所以这也就证明了虽然引用可以看成指针,但两者并不相等.
2.引用一旦被初始化,它就指向了唯一的一个固定对象,不可以改变它所指向的对象,但是可以通过引用改变该对象的值,而指针可以随便你指来指去.
int a = 1;
int &b = a;
int d = 2;
&b = d; //编译器报错,说&b不是一个左值,so 它一定是一个右值咯,而指针是既可以做左值也可以做右值的.
3.不可以赋值NULL给引用(但是可以间接的赋值),而指针则可以赋值NULL.
int &a = NULL; //编译器直接报错
int *b = NULL;
int &c = *b;//不报错,但是执行的时候会段错误
之所以编译时候不报错执行的时候会报错是因为在第一点中已经证明了编译器不会去追溯到b指向的是什么,它只会检查c有没有被初始化,所以第二种方式可以通过编译,但是执行的时候由于b指向的值为NULL,那么c中存放的就是0,那么当调用c的时候他会去访问0地址内存中的内容,这个操作是操作系统所不允许的.