【问题标题】:(c++) checking array of pointers for null value(c++) 检查指针数组的空值
【发布时间】:2018-03-27 16:45:11
【问题描述】:

我对指针初始化的概念理解停滞不前。

我已经创建了一个这样的数组:

int *A = NULL;
A = new int[p];

现在尝试模拟在此数组 A 中插入值。 这里有一个问题,想象一下数组是否已经放置了一些值。

例如:

A[0]= 10;
A[1]= 4;
A[2]= NULL;
A[3]= 2;

如何约束 if 语句来检查数组是否为空?

用 i 遍历数组值并检查

if(A[i] == NULL){
cout << "hello";
}

永远不会打印出来?

但是!如果我初始化数组然后执行此操作。

int *A;
A = new int[p];
for (int i = 0; i < p; i++) {
    A[i] = 0;
}

它将允许我捕获那个 NULL 值并执行我的操作。

int *A = {0}; 有什么区别? (目前不为我工作)

并循环遍历,将每个值单独设置为 0?

【问题讨论】:

  • 您的数组包含int 值,请勿将NULL 与它们一起使用。实际上在 C++ 中一般不要使用NULL,而是在处理指针时使用nullptr。 “如果我初始化数组,那么就这样做。”做什么?您的代码 sn-p 仅显示数组初始化。你应该提供mcve
  • int 类型定义“unfilled”是什么意思?您的数组不包含指向ints 的指针,它包含ints。
  • “我应该用向量来代替吗?”大概。老实说,“想象一下,如果数组已经放置了一些值。”并没有真正的意义,为什么这些值不连续,这些值来自哪里?等等...如果您想在迭代中隐藏某些值,那么只需分配那些“隐藏”值-1 并跳过它们。
  • 谢谢大家的回复。这让我意识到我的实际问题应该是。 “有什么方法可以让我在不实际输入“-1”或 0 之类的数字的情况下查看哪些值是“空”的?对于实际输入值 0 或 -1 的奇怪情况。
  • 解决方案会因具体情况不同而有所不同,但通用的解决方案是使用boost::optional&lt;int&gt;或自己滚动,如果你觉得懒惰,你也可以创建一个强大的数组句柄并检查它们是否为空std::vector&lt;std::unique_ptr&lt;int&gt;&gt;

标签: c++ arrays pointers null initialization


【解决方案1】:

C++ 允许您使用以下语法“值初始化”数组-

new int[size]()

根据 ISO C++03 5.3.4 [expr.new]/15-

创建 T 类型对象的 new 表达式按如下方式初始化该对象: 如果 new-initializer 为 () 形式,则该项为值初始化 (8.5)

使用上述方法,您可以修改代码,如下所示-

int *A = NULL;
A = new int[p]();
if(A[i] == 0){
  //do whatever
}

【讨论】:

    【解决方案2】:

    在 C++11 及更高版本中,建议避免使用 new/delete。我建议使用合适的容器,例如std::vector&lt;int&gt;。使用 std 容器时,不需要 NULL 检查。

    如果此容器不能满足您的需要,std::unique_ptr 仍然是比原始指针更好的选择。

    【讨论】:

      【解决方案3】:

      A 的每个元素的类型int。使用NULL 作为int 的元素没有多大意义,NULL 更多的是与指针文字值有关;尽管从 C++11 开始,nullptr 代表了这一点。

      除非您愿意为“未设置”int 使用粗略的“魔法值”,否则请考虑使用std::vector&lt;boost::optional&lt;int&gt;&gt; 作为A 的类型。然后,您可以判断一个元素是否已被显式设置。

      boost::optional 将作为std::optional 发布到未来的标准 (C++17) 中,因此请在适当的时候对其进行重构。 (在 C++17 之前的另一种方法是从未来的 C++ 标准库中借用源代码:std::optional 在 C++11 之后可以轻松实现。)

      参考文献:

      http://en.cppreference.com/w/cpp/utility/optional http://www.boost.org/doc/libs/1_61_0/libs/optional/doc/html/index.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-09
        • 1970-01-01
        • 2013-12-20
        • 1970-01-01
        • 2017-10-23
        相关资源
        最近更新 更多