(c ++)检查指针数组的空值

时间:2017-10-16 08:06:43

标签: c++ arrays pointers null initialization

我对指针初始化的概念性理解处于停顿状态。

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

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?

3 个答案:

答案 0 :(得分:0)

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

除非您愿意为“未设置”int使用粗略的“魔术值”,否则请考虑使用std::vector<boost::optional<int>>作为A的类型。然后,您可以判断是否已明确设置元素。

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

参考文献:

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

答案 1 :(得分:0)

在C ++ 11及更高版本中,建议避免使用new/delete。我建议使用适当的容器,例如std::vector<int>。使用std容器时,不需要进行NULL检查。

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

答案 2 :(得分:0)

C ++允许你进行&#34;值初始化&#34;使用以下语法的数组 -

new int[size]()

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

创建类型为T的对象的new-expression初始化该对象,如下所示: 如果new-initializer的格式为(),则该项为值初始化(8.5)

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

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