中铁中基建设集团网站,网站建设幽默,wordpress原创公司主题,深圳国内设计网站空指针#xff08;null pointer#xff09;不指向任何对象#xff0c;在试图使用一个指针之前代码可以首先检查它是否为空。声明空指针的3种方法#xff1a;
int* p1 NULL;
int* p2 nullptr;
int* p3 0;
在C语言中常用NULL生成空指针#xff0c;NULL是一个宏#xf…空指针null pointer不指向任何对象在试图使用一个指针之前代码可以首先检查它是否为空。声明空指针的3种方法
int* p1 NULL;
int* p2 nullptr;
int* p3 0;
在C语言中常用NULL生成空指针NULL是一个宏定义如下
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
可以看到NULL表示0或无类型指针void*。在C中NULL优先解释为整型0而不是指针值。所以使用NULL时可能会出现问题
#include iostreamusing namespace std;void f(int)
{cout f(int) endl;
}void f(int*)
{cout f(int*) endl;
}int main()
{f(0);f(NULL);f((int*)NULL);/*输出结果f(int)f(int)f(int*)*/return 0;
}
程序本意是想通过f(NULL)调用指针版本的f(int*)函数但是由于NULL被定义成0因此与程序的初衷相悖。
C11引入了新关键字nullptr表示空指针。在新标准下现在的C程序最好使用nullptr同时尽量避免使用NULL。
还有一种方法是用常量0初始化指针来生产空指针。但是把int变量直接赋给指针是错误的操作即使int变量的值恰好等于0也不行。
int zero 0;
pi zero;//错误:不能把int变量直接赋给指针 以下内容来自《C Primer第5版》2.3.2 指针
建议初始化所有指针
使用未经初始化的指针是引发运行时错误的一大原因。
和其他变量一样访问未经初始化的指针所引发的后果也是无法预计的。通常这一行为将造成程序崩溃而且一旦崩溃要想定位到出错位置将是特别棘手的问题。
在大多数编译器环境下如果使用了未经初始化的指针则该指针所占内存空间的当前内容将被看作一个地址值。访问该指针相当于去访问一个本不存在的位置上的本不存在的对象。糟糕的是如果指针所占内存空间中恰好有内容而这些内容又被当作了某个地址我们就很难分清它到底是合法的还是非法的了。
因此建议初始化所有的指针并且在可能的情况下尽量等定义了对象之后再定义指向它的指针。如果实在不清楚指针应该指向何处就把它初始化为nullptr或者0这样程序就能检测并知道它没有指向任何具体的对象了。