如何检查指针指向的对象是否为空?

时间:2015-08-13 03:53:48

标签: c++ pointers

我来自Java方面,如果你想检查ArrayList中的特定条目是否已分配,你可以在ArrayList中获得该实体的引用,并检查它是否是是否为空。

基本上我正在努力完成同样的事情。这是我的代码的简化版本:

struct node
{
   int count=0;
   int nodeval=0;

   bool valid=false;
};

bool operator==(const node* n,int val)
{
   if (n->count==0&&n->nodeval==0&&n->valid==false)
   if(val==NULL)
      return true;
   else
      return false;
}

node* lookup(int val)
{
   return &Table[val];
}

int main()
{
   res=somevalue;
   node* child=lookup(res);
   if(child==NULL)
   {
      //do something
   }
}

以下是我的理解:

  1. lookup()将返回Table数据结构中选择位置的地址。我把它存放在孩子身上。
  2. 检查子指针是否有空指针没有意义,因为我们返回一个内存位置的正确引用,所以我重载它。
  3. 在重载==中,我检查每个字段是否未更改,如果是,则不更改,因此是“空实体”。问题是==运算符需要一个用户定义的对象来操作。
  4. 问题

    1. 我在前面提到的步骤中出了什么问题?
    2. 是否有更简单的方法来检查指针指向的对象是否未被更改/ null?

1 个答案:

答案 0 :(得分:1)

您的问题不是100%清楚,但我会尝试澄清我在您的代码中看到的一些误解:

  1. lookup()可以返回null。声明该函数返回一个指针,该指针可以为null。如果这不是错误(见下文),则返回null。

  2. lookup()内,您首先需要检查Table是否实际包含具有该索引的元素。如何做到这一点取决于Table的类型。如果它是一个普通数组,只需检查索引是否小于元素中的大小,如果不是则返回null。

  3. 请注意,如果您始终期望查找结果,则返回的类型应该是引用而不是指针。但是,在这种情况下,您需要对无效索引进行错误处理。您可以将这些声明为编程错误,并将assert()声明为有效。或者,你可以throw std::out_of_range("invalid index")

    最后,关于你的问题“如何检查指针所指向的对象是否为空?”:答案是如果你有一个指针Object* ptr,你只需取消引用指针*ptr并将其与null(即if (*ptr == 0))进行比较。但是,这要求对象的类型与null相当,这通常只是数字对象(bool,char,int,float等)和指针的情况。节点类的对象通常不能与null相比,并且使它们与null(使用运算符重载)相当也没有多大意义。