【问题标题】:initialize multidimensional array with a char?用char初始化多维数组?
【发布时间】:2015-05-12 05:18:04
【问题描述】:

我想用“/”初始化一个 10x10 的字符数组。 这是我做的:

char array[10][10] = {'/'}

但结果是一个有1个'/'的数组,其他都是空格...

为什么 int 数组有效而 chars 无效? 如果我写:

int array[10][10] = {0}

结果是一个全为 0 的数组。

提前感谢您的回答! :)

【问题讨论】:

标签: c++ arrays multidimensional-array


【解决方案1】:

使用时:

char array[10][10] = {'/'};

只有一个数组元素初始化为'/',其余元素初始化为零。您可以通过以下方式解决此问题:

  1. 使用memset设置所有元素的值。

    memset(&array[0][0], '/', sizeof(array));
    
  2. 使用for循环来初始化每个成员。

    for (int i = 0; i < 10; ++i )
       for (int j = 0; j < 10; ++j )
          array[i][j] = '/';
    
  3. 使用std::fill填充数据

    std::fill(std::begin(array[0]), std::end(array[9]), '/');
    

    std::fill(std::begin(*std::begin(array)), std::end(*std::end(array)), '/');
    
  4. 使用std::vector 代替数组。

    std::vector<std::vector<char>> array(10, std::vector(10, '/'));
    

【讨论】:

  • 可以使用std::fill吗?
【解决方案2】:

你可以使用std::fill

std::fill( &array[0][0], &array[0][0] + sizeof(array), '/' );

【讨论】:

    【解决方案3】:

    根据 C++ 标准 *8.5.1 聚合)

    7 如果列表中的初始化子句少于 聚合中的成员,然后每个成员未显式初始化 应从其大括号或相等初始化器初始化,或者,如果有 不是大括号或等式初始化器,来自一个空的初始化器列表 (8.5.4)。

    和(8.5.4 列表初始化)

    ——否则,如果初始化列表没有元素,对象是 值初始化。

    和(8.5 初始化器)

    ——如果 T 是一个数组类型,那么每个元素都是值初始化的; — 否则,对象被零初始化

    因此在这两个定义中

    char array[10][10] = {'/'}
    int array[10][10] = {0}
    

    所有没有对应初始化器的元素都是值初始化的,对于基本类型意味着零初始化。除了数组的第一个元素之外的所有元素都将设置为零。这意味着您示例中的两个数组都以相同的方式“工作”。:)

    【讨论】:

      猜你喜欢
      • 2015-08-01
      • 1970-01-01
      • 2013-04-04
      • 2011-04-03
      • 2015-07-20
      • 2015-02-26
      相关资源
      最近更新 更多