1. 空指针常量

一个表示0值的整数常量,叫做空指针常量。例如:0,(void*)0,void* NULL

空指针常量可以赋值给任何指针类型,因为它是变体类型(void*)

更倾向于用NULL表示空指针常量

int *p = 0;
int *p = NULL;

2. NULL指针

NULL是一个标准规定的宏定义,用来表示空指针常量。在C++里面被直接定义成了整数立即数的0,而在没有__cplusplus定义的前提下,就被定义成一个值是0的 void* 类型的指针常量

数值为0的指针,C++标准规定,认为这个指针是空的。不要把空指针的内部实现表示等同于整数0的对象表示

空指针在虚拟内存中指向的是最下面的那段不可访问空间

野指针不是空指针,是指向垃圾内存的指针。

形成的原因:

  1. 在创建的时候没有被初始化。
  2. 指针被free或delete后,没有设置成NULL,让人误认为这是一个合法的指针
  3. 指针操作超越了变量的作范围

使用指针的注意事项:

  1. 定义指针时,要么初始化为NULL,要么指向一块合法的内存
  2. 用malloc申请内存后,要立即检查指针值是否为NULL。防止使用空值指针。
  3. 不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值引用。
  4. 动态内存的申请与释放必须配对,防止内存泄漏
  5. 用free或delete释放内存后,立即将指针置为NULL,防止成为空指针

3. void*

void*变体类型指针,如果将void*类型指针赋给其他类型指针,则需要强制转换;

int i = 10;
void* p = &i;
int* pp = (int*)p;

void*指针不可以解引用(取内容)

若要正确删除掉void*指向的动态类型变量,需要进行强制类型转换,否则会发生内存泄漏。

发生内存泄漏的原因在于,在delete的过程中,编译器并不知道该void*指向的什么类型的变量,就无法正确调用原类型的析构函数,只是简单地清空了一个指针。