【问题标题】:Check reference for NULL value C++检查 NULL 值 C++ 的参考
【发布时间】:2016-01-10 17:41:24
【问题描述】:

我读过“在 C++ 中检查引用是否等于 null 是没有意义的”——因为引用永远不能有 null 值。但是,我发现这个陈述在我想出的以下示例中不成立:

void InsertNode(struct node*& head, int data)
{
    cout << head << endl;

    node* temp = new node();
    temp->data = data;
    temp->next = NULL;

    if (head == NULL)
        head = temp;
    else
    {
        temp->next = head;
        head = temp;
    }
}

我正在检查if (head == NULL)。尽管 head 作为参考传递,但我正在检查它是否等于 NULL。这与我读过的“检查引用是否等于 null 在 C++ 中毫无意义”的陈述相矛盾 - 任何人都可以解释一下我的理解是否正确吗?谢谢。

【问题讨论】:

  • C++ 的参数列表中不需要struct。结构和其他类型的单独命名空间仅存在于 C 中。
  • 您没有检查参考。您正在检查所指对象,它恰好是一个指针。
  • 测试引用将是if (nullptr == &amp;head)
  • @n.m 引用是“某物”的别名,这个“某物”被称为所指对象吗?那么这意味着,检查引用和检查引用是相同的权利 - 给定的引用只是引用的别名。
  • @Jarod42 "&head" 不是返回头部地址吗?

标签: c++ pointers reference pass-by-reference


【解决方案1】:

你不检查引用是否为空,而是检查它是否引用了一个空指针,这是不同的。

也许举个例子会有所帮助:

int i = 42;
// check if a variable is null
if (i == 0) print("i is null");

// pointer
int* pi = &i;
// check if a pointer is null
if (pi == 0) print("pi is null");
// check if a pointer points to a null
if (*pi == 0) print("i is null");

// reference
int& ri = i;
// check if a reference refers to a null
if (ri == 0) print("i is null");

对引用的另一种描述可能会有所帮助:引用是一个自解引用的非空指针。这意味着您不必编写*pi 来获取它指向的对象,而只需编写ri。这也意味着它保证不为空。请注意,您可以编写违反此保证的程序,但这些程序无论如何都会导致所谓的未定义行为,因此不值得为此烦恼,因此最初使您感到困惑的语句。

【讨论】:

  • 在这种情况下,我将如何检查引用是否为空?
  • 你不需要,因为“检查引用是否等于 null 在 C++ 中没有意义”。在将 C++ 与例如 C++ 进行比较时,这种区别很重要。 Java,其中引用实际上可以为空,或者在将 C++ 引用与 C++ 指针进行比较时,C++ 指针也可以为空。
  • 非常感谢乌尔里希!但我还是有点不清楚。引用为 null 和引用所指为 null 之间有什么区别?两者不一样吗?你能给我一个例子来说明你如何检查一个引用是否为 null 以及你如何检查它所指的是 null 吗?
猜你喜欢
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多