我对指针初始化的概念理解停滞不前。
我创建了一个这样的数组:
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?
A
的每个元素的类型都是一个int
。使用 NULL
作为int
的元素没有多大意义,NULL
更多地与指针文字值有关;虽然从 C++11 开始,nullptr
代表了这一点。
除非您愿意对"未设置"int
使用粗略的"魔术值",否则请考虑使用 std::vector<boost::optional<int>>
作为A
的类型。然后,您可以判断是否已显式设置元素。
boost::optional
作为std::optional
被发送到未来的标准(C++17)中,因此请在适当的时候重构。(C++17 之前的另一种方法是从未来的 C++ 标准库中借用源代码:std::optional
在 C++11 以后很容易实现。
引用:
http://en.cppreference.com/w/cpp/utility/optionalhttp://www.boost.org/doc/libs/1_61_0/libs/optional/doc/html/index.html
在 C++11 及更高版本中,建议避免new/delete
。我建议使用适当的容器,例如 std::vector<int>
.使用 std 容器时,无需进行 NULL 检查。
如果此容器不能满足您的需求,std::unique_ptr
仍然是比原始指针更好的选择。
C++ 允许您使用以下语法"值初始化"数组-
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
}