【问题标题】:initializing a 2D array (Matrix) in C++在 C++ 中初始化二维数组(矩阵)
【发布时间】:2018-08-21 07:09:03
【问题描述】:

我正在尝试通过 for 循环创建一个二维数组,但我得到了一些垃圾随机数 代码:

unsigned int i, j;
int matrix[10][10];//={{},{}};

for (i = 0; i < sizeof(matrix[i])/sizeof(int); i++) {
    for (j = 0; j < sizeof(matrix[j])/sizeof(int); j++) {
        cout <<matrix[i][j] << " " << flush;
    }
    cout << endl;
}

当我将 cout 部分更改为以下内容时

cout <<matrix[i][j] = {{i},{j}} << " " << flush;

我得到一个错误。

我该怎么做呢? 先感谢您。

【问题讨论】:

  • 这是一个二维数组,不是 10D
  • 填充矩阵的代码在哪里?
  • @JJcopl 为什么您期望的输出与您看到的不同?你期待看到什么?您可能会考虑定义一些常量而不是使用 sizeof (这不会按您期望的方式工作)。如果您将其中一个数组维度更改为与另一个不同的数字,您当前的代码将会中断。试试这个:const int dim1 = 10; const int dim2 = 10; int matrix[dim1][dim2]; for (i = 0; i &lt; dim1; i++) { for (j = 0; j &lt; dim2; j++) {...} }

标签: c++ for-loop multidimensional-array


【解决方案1】:

数组的维度是使用多少个索引来访问它,它不同于一个维度的大小(维度的一行有多少个元素),它不同于一个数组的大小或整个数组的元素个数。

根据您编写的内容,您正在编写一个 10 行的二维数组,每行包含 10 个元素,总大小为 100 个元素。

如果你想用那个语法做一个初始化列表,你必须在嵌套的大括号中指定每一行和每个元素。您有一组用于整个数组的顶级大括号,然后是一组用于每个子数组的大括号。您可以用花括号括住每一行,将每个元素指定为逗号分隔的列表:

unsigned int i, j;
int matrix[10][10] = {{1,2,3,4,5,6,7,8,9,10},
                     {1,2,3,4,5,6,7,8,9,10},
                     {1,2,3,4,5,6,7,8,9,10},
                     {1,2,3,4,5,6,7,8,9,10},
                     {1,2,3,4,5,6,7,8,9,10},
                     {1,2,3,4,5,6,7,8,9,10},
                     {1,2,3,4,5,6,7,8,9,10},
                     {1,2,3,4,5,6,7,8,9,10},
                     {1,2,3,4,5,6,7,8,9,10},
                     {1,2,3,4,5,6,7,8,9,10}};

已编辑:表达式 sizeof(matrix[i]) 将数组的大小设置为 40,因为编译器能够在编译时计算出来,但是依赖它可能会有风险,因为如果将其更改为指向数组的指针或数组作为参数传递给函数,它将给出指针的大小而不是数组(如此处所述:How do I determine the size of my array in C?)。最好用已知长度显示这样的数组:

for (i = 0; i < 10; i++) {
    for (j = 0; j < 10; j++) {
        cout <<matrix[i][j] << " " << flush;
    }
    cout << endl;
}

通常,为了更改的安全和方便,您可以使用如下宏定义尺寸:

#define ROWS 10
#define COLS 10
int matrix[ROWS][COLS] = ...;

然后

for (i = 0; i < ROWS; i++) {
    for (j = 0; j < COLS; j++) {
        cout <<matrix[i][j] << " " << flush;
    }
    cout << endl;
}

这样,如果您决定将来更改矩阵的大小,您只需在一个地方更改数字,即宏定义,而不是在代码中寻找每个单独的常量(尤其是重复常量10,您可能会错过一个或更改一个额外的,这意味着其他东西,这会导致其他地方出现问题。

【讨论】:

  • 啊啊啊,谢谢指正。我之前没有测试过,并且误解了编译器如何处理数组和指针。谢谢!我也学到了一些东西。将编辑
猜你喜欢
  • 2022-12-15
  • 2022-01-12
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 2021-04-04
相关资源
最近更新 更多