C++中三种生成空指针的方法与注意事项(区别)
空指针null pointer不指向任何对象,在试图使用一个指针之前代码可以首先检查它是否为空if(p!nullptr)//只要是空指针都能检测出来 { *p5//安全操作 }以下列出几个生成空指针的方法int *p1nullptr; //等价于int *p10;(代码层面等价) int *p20; //直接将p2初始化为字面常量0 int *p3NULL; //等价于int *p30;推荐用关键字nullptr来初始化指针是C11后专门用于表示空指针的特殊关键字它可以被转化成任意其他的指针类型其本身就是指针类型更不会引发歧义。而NULL属于宏在cstdlib头文件中宏定义为#define NULL 0在预处理阶段代码中的NULL会被替换为字面常量0因此是整数类型void func(int) { cout整数endl; } void func(int*) { cout指针endl; } int main() { func(0);//整数 func(NULL);//整数 func(nullptr);//指针 }把int变量直接赋给指针是错误的操作即使int变量的值恰好等于0也不行。必须是字面常量int zero10;//变量 const int zero20;//常变量 int *p1zero1;//非法 int *p2zero2;//非法 int *p30;//字面常量 合法为什么字面常量0能被用来生成空指针呢答C规定值为0的整数字面量属于特殊的「空指针常量」可以隐式转化为任意指针类型用来初始化空指针。为什么函数重载时字面常量0没有调用指针类型函数而是整数类型呢不是隐式转化了吗答字面常量0有双重身份本身是int整数字面量可以隐式转化为任意指针仅用于指针初始化/赋值重载函数匹配优先级精确匹配隐式转换匹配void func(int) { cout整数endl; } void func(int*) { cout指针endl; } int main() { int *p0 func(0);//整数 func(p);//指针 }建议建议初始化所有的指针并且在可能的情况下尽量等定义了对象之后再定义指向它的指针。如果实在不清楚指针应该指向何处就把它初始化为nullptr这样程序就能检测并知道它没有指向任何具体的对象了。