NULL == 指针 [重复]

Posted

技术标签:

【中文标题】NULL == 指针 [重复]【英文标题】:NULL == pointer [duplicate] 【发布时间】:2013-07-21 12:40:36 【问题描述】:

在C++中,我们通常检查一个指针是否为空,我只知道我们应该使用

if(NULL == ptr)

代替:

if(ptr == NULL)

我想知道为什么?

另外,如果我们想将一个ptr初始化为null,我们应该使用ptr = NULL还是ptr = 0?是的,我知道在 C++ 中,我们通常使用ptr = nullptr,我想知道我们为什么要这样做只是为了统一代码?谢谢

【问题讨论】:

我通常写if (!ptr)。它更短,冗余更少。 我在这里有点困惑,您的问题是为什么不能使用NULL==ptr 而不是ptr==NULL,还是您的问题是为什么不能使用= 而不是@987654331 @ ? 我问了两个问题 它被称为Yoda Condition 【参考方案1】:

这是一种编码风格(命名为 Yoda Conditions),以避免在 if 语句中使用 = 而不是 ==,在 if 语句中使用赋值 = 是有效的,但它通常不是你想要的想要。

就我个人而言,我不喜欢这样使用,因为它很难阅读,而且当你在 if 语句中使用 = 时,现代编译器会警告你。

还要注意:

    if(ptr == NULL)if(!ptr) 相同。 C++11 引入了nullptr 来替换使用NULL。所以要初始化一个空指针,最好使用ptr = nullptr

关于为什么使用nullptr 而不是NULL

在 C++11 之前,NULL 通常在内部实​​现为#define NULL 0,但问题是,0 也是整数零。在某些情况下可能会引起麻烦。例如:

void func(int n);   
void func(char *s);

func(NULL);   //call which function?

虽然作者暗示NULL 是指针类型,但编译器只知道调用func(0)。所以第一个版本会被调用。

使用func(nullptr),编译器会知道它是一个指针并调用第二个版本。

【讨论】:

+1,但我要指出,问题是 = 即使在条件句中也是 assignment - 这常常让初学者感到困惑。在此答案中始终假定这一点,但从未明确说明。 这是nullptr,而不是null_ptr 是的,在我的第二个问题中,我知道我们应该使用 nullptr,我想知道为什么?只想统一代码风格? @minicaptain 你的意思是你不明白为什么使用nullptr 而不是NULL 或者为什么要初始化一个指向空指针的指针? 我想知道为什么要使用nullptr ove null,谢谢!【参考方案2】:

使用 yoda 相等可以防止某些错误,例如使用单个 = 或编译器尝试从智能指针确定整数。

已经知道了

我花了两天时间追查这个错误,因为他们认为 yoda 是个坏主意。

【讨论】:

以上是关于NULL == 指针 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

通过NULL类指针调用类方法[重复]

在 NULL 指针上调用 delete 或 delete[] [重复]

释放堆内存后将指针设置为 NULL [重复]

测试答案是错误的?当我们删除安全的 NULL 指针时它不会崩溃 [重复]

结果集sqlite的Java Null指针异常[重复]

GNU链接器:如果头文件中的指针被声明为NULL和/或extern [重复]