2017-10-16 83 views
1

我对指针初始化的概念性理解处于停滞状态。(C++)检查指针数组为空值

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

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

现在试图模拟插入值这个数组,A 这里是收集,试想如果阵列已放置一些值。

例如:

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

我将如何限制的,如果检查语句,如果数组为空?

迭代通过与我的数组值和检查

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?

+0

你的数组包含'int'值,不要使用'NULL'。实际上,一般不要在C++中使用'NULL',而应该在处理指针时使用'nullptr'。 “如果我初始化数组,然后执行此操作。”做什么?你的代码片段只显示数组的初始化。您应该提供[mcve](https://stackoverflow.com/help/mcve) – VTT

+0

定义“int”类型的“_unfilled_”是什么意思?你的数组不包含指向'int'的指针,它包含'int's。 –

+0

“我应该用矢量做这个吗?”大概。说实话“想象一下,阵列已经有了一些价值。”实际上并没有多少意义,为什么这些价值观不是连续的,价值从何而来?等等......如果你想在迭代中隐藏某些值,那么只需将这些“隐藏”值分配给'-1'并跳过它们。 – George

回答

0

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

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

boost::optional正在被排放到未来的标准(C++ 17)为std::optional,所以在适当的时间重构。 (另一种方法之前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

0

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

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

0

C++允许使用以下syntax-

new int[size]() 

按照ISO C++ 03 5.3.4 [expr.new]/15-

“值初始化” 的阵列创建类型T的对象的新表达初始化该对象如下:如果新的初始值设定的形式()的 ,该项目是值初始化(8.5)

使用上述方法就可以修改你的代码为如下所示 -

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