NULL
- NULL是一个宏定义,在C语言中NULL被定义为(void *)0,而在C++中NULL被定义为0
- 空指针和野指针
(1)空指针是指不指向任何内存空间的指针;以前C++中使用0来表示空指针,由于NULL是0的宏定义,因此,空指针用NULL表示
(2)野指针是指指向无效内存空间的指针,声明一个指针后,该指针指向的是无效内存空间,因此,一般需要将其声明为空指针int * ptr = NULL
- 由于空指针可以用0表示,因此0既可以表示整型常量又可以表示指针常量,所以NULL也同样既可以表示指针常量又可以表示整型常量
int x = NULL;
int * ptr = NULL;
- 在C++中是允许函数重载的,而NULL为0的宏定义,因此在传入NULL参数时,会将NULL看做整型常量0
void show(int x)
{
cout << "int" << endl;
}
void show(char* ptr)
{
cout << "char *" << endl;
}
int main()
{
show(NULL);
return 0;
}
nullptr
- nullptr是C++11引入的关键字,不是宏定义,用于表示空指针,它是指针类型,不能转换为整数类型(强转另当别论),因此调用
show(nullptr)
将输出char *
- nullptr的引入避免了整型常量0和指针常量0的混淆
- 后续在将指针初始化为空指针时,最好使用nullptr,当然,这并不代表
int * ptr = 0;
或int * ptr = NULL
不能被使用,为了向后兼容,C++仍然支持使用0或者NULL来表示空指针,因此nullptr == 0
为true
,但是能用nullptr还是尽量用nullptr吧
using
- using关键字C++11提供了另一种创建别名的方法,其功能相当于
typedef
,但比typedef
更强大
typedef int* INT;
INT_PTR ptr1, ptr2;
using INT_PTR = int *;
INT_PTR ptr1, ptr2;
- using可用于模板部分具体化而typedef不行
template<typename T>
using arr12 = std::array<T, 12>;
std::array<double, 12> a1;
arr12<double> a1;