我对指针初始化的概念性理解处于停顿状态。
我创建了一个这样的数组:
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?
答案 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
}