一。指针与引用的区别(面试长问题)
- 指针本身是一个对象,允许指针赋值和拷贝,开辟新的的内存存储指针。而引用只是对象的别名不允许复制拷贝,不会开辟新内存。
- 指针在其生命周期内可以指向不同的对象,而引用不能再与其他对象绑定。
- 指针无需在定义时赋初值,但是引用必须要绑定一个初始对象。
二。空指针与void *类型指针
空指针:不指向任何对象,可以再定义指针时将指针初始化为空,可以避免错误。
生成空指针的方法:int *p1=nullstr; //三种方法是等价的
int *p2=0;
int *p3=NULL;
nullstr是C++11新加入的方法,在使用时优先选择此方法,NULL是一个预处理变量,需要添加cstdlib头文件,才能处理,具有C属性。
void*
类型指针是一种特殊的指针类型,可以存放任意类型的指针,里面存放的也是地址;只是不能对它进行直接操作,因为无法判断存储对象的类型;能做的事情拿它与其他的指针进行比较、作为函数的输入输出或者赋给另一个void *指针。
三。常量指针与指针常量的区别
常量指针:指针不能变,定义时必须初始化,但是所指对象的值可以改变
指向常量的指针:指向的对象是常量,指针可变,不一定定义时初始化
int *const p1=&a; //p1常量指针,指向int型对象a,指针p1不能改变,只指向a,而a的值可以改变;
const int *p2=&b; //p2指向常量的指针,指向int型常量a,p2指向的对象a不能改变,p2值可以改变。
int a=10,b=20;int *const p=&a; //指针p不能改变,只指向a,而a的值可以改变;p=&b //错的*p=b //对的
还有常量引用与指向常量的引用,对于复合类型的判断,从右往左的阅读习惯,最接近变量的是最内层的修饰。