理解C++中的零和NULL

Understanding Zero and NULL in C++

本文关键字:NULL C++ 理解      更新时间:2023-10-16

在搜索应该使用Zero还是Null的答案时,我在SO上的另一个问题中遇到了这个问题,来自用户stroustup:

我应该使用NULL还是0?在C++中,NULL的定义是0,因此只是审美上的差异。我更喜欢避免使用宏,所以我使用0。NULL的另一个问题是人们有时会错误地相信它不同于0和/或不是整数。在预标准中代码,NULL有时被定义为不合适的内容因此不得不避免。现在这种情况不太常见了。

所以NULL和0是一样的,这很酷。但我需要更多的理解:假设我有以下内容(来自cprograming.com的一个随机示例):

struct node {
  int x;
  node *next;
};
int main()
{
  node *root;       // This won't change, or we would lose the list in memory
  node *conductor;  // This will point to each node as it traverses the list
  root = new node;  // Sets it to actually point to something
  root->next = 0;   //  Otherwise it would not work well
  root->x = 12;
  conductor = root; // The conductor points to the first node
  if ( conductor != 0 ) {
    while ( conductor->next != 0)
      conductor = conductor->next;
  }
  conductor->next = new node;  // Creates a node at the end of the list
  conductor = conductor->next; // Points to that node
  conductor->next = 0;         // Prevents it from going any further
  conductor->x = 42;
}

while ( conductor->next != 0)线为例;我的理解是,内存中的那个点可能有以前使用过的垃圾值。当程序将其从使用中释放时,它将再次可用。那么,如何使用整数零作为值进行比较,以检查您是否已到达链表的末尾呢?你能保证垃圾值为零吗?为什么它不…只是一个随机的垃圾值?

那么,我的理解是完全偏离了,还是在前一个程序释放内存块的过程中,内存被重新归零了?在过去,我总是使用NULL,认为它是一个神奇的关键字,可以知道它是在寻找零还是垃圾值。然而,读到上面对别人问题的回答,我发现这不是真的。我为这样一个琐碎的问题道歉,但每次我在应用程序中与NULL或零进行比较以检查是否存在某种东西时,我都会感到困扰,因为它只是起作用,我不知道为什么。谢谢你给我带来的光明。

首先,Stroustrop不仅仅是"用户";他是C++语言的原作者和发明者。这句话出自他的一个常见问题。

在几乎所有的C和C++实现中,NULL只是0的#define(文本替换)。因此,的区别是纯粹的美学。

没有魔法。也许您没有理解"下一个"指针。它是下一个项目的地址,而不是项目本身。由于没有有效的指针0,所以它是一个方便的哨兵或标记,表示列表中没有下一个项目。如果一个节点被删除,则没有任何东西会自动将指向它的指针(即位于前一个节点中的下一个指针)设置回NULL/0。