如何将二维数组初始化为0

3
int array2d[3][5]{};

for (auto& iter1 : array2d)
{
    cout << "iter1 in 2d array - " << iter1 << endl;
    for (auto& iter2 : iter1)
    {
        cout << "iter2 in 2d array - " << iter2 << endl;
    }
}

结果

在 2d 数组中的 iter1 - 00CFFCB4
在 2d 数组中的 iter2 - 0
在 2d 数组中的 iter2 - 0
在 2d 数组中的 iter2 - 0
在 2d 数组中的 iter2 - 0
在 2d 数组中的 iter2 - 0
在 2d 数组中的 iter1 - 00CFFCC8
在 2d 数组中的 iter2 - 0
在 2d 数组中的 iter2 - 0
在 2d 数组中的 iter2 - 0
在 2d 数组中的 iter2 - 0
在 2d 数组中的 iter2 - 0
在 2d 数组中的 iter1 - 00CFFCDC
在 2d 数组中的 iter2 - 0
在 2d 数组中的 iter2 - 0
在 2d 数组中的 iter2 - 0
在 2d 数组中的 iter2 - 0
在 2d 数组中的 iter2 - 0

如何将二维数组初始化为 0?


它已经全部是零了。那些其他的值是每行的地址(iter1 是一个一维数组的引用)。 - Cruz Jean
2个回答

4

你的二维数组确实已经将所有元素初始化为零!这是由于输出中有十五行形式为iter2 in 2d array - 0

iter1的非零输出实际上是地址iter1 的类型是 int (&iter1)[5] - 对于每个外循环,它是二维数组每个“行”的地址。


0

对于m行n列,

vector<vector<int> > array2d( m , vector<int> (n));  

3
自C++14以来,这既不是一个数组,也不能保证零初始化。 - Cruz Jean
1
我认为“第二个数组”的问题是与问题的代码块中iter1iter2的含义混淆了。 - Cruz Jean
@CruzJean,您所说的“甚至不能保证零初始化”是什么意思呢?std::vector<int>(n)是一个包含n个零int的向量。 - Evg
很抱歉,@CruzJean 的观点是错误的。在 C++11/14/17 中,您可以保证获得零值。自 C++14 开始,元素是 T 类型的默认插入实例。使用默认分配器,元素将作为 T() 进行值初始化,例如 int() 表示整数零。 - Evg
@Evg 啊,我改正了。我原本以为 int() 是未初始化的,而 int{} 是零初始化的。不过,我仍然建议使用 vector<int>(n, 0) 构造函数来明确表达你的意图。 - Cruz Jean
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接