c++ - 在 C++ 中使用 sizeof() 遍历二维数组

标签 c++ arrays loops

<分区>

我正在尝试编写一个小型 C++ 库来进行简单的矩阵计算。它由一个 Matrix 类和改变给定矩阵的静态成员函数组成。

我有一个函数可以为每个元素添加一个标量,但是循环不起作用:

// Member function to add a scalar to the matrix
void Matrix::add_scal(double** arr, double s) {
    for (size_t x = 0; x < sizeof(arr) / sizeof(*arr); ++x) {
        Serial.println("test");
        for (size_t y = 0; y < sizeof(*arr) / sizeof(**arr); ++y) {
            arr[x][y] += s;
        }
   }
}

“测试”只打印一次,内循环根本不运行。这是我用来创建矩阵的函数:

double** Matrix::init(int rows, int cols) {
    double** temp = new double*[rows];
    for (int i = 0; i < rows; i++) {
        temp[i] = new double[cols];
        for (int j = 0; j < cols; j++) {
            temp[i][j] = 0.0;
        }
    }
    return temp;
}

以下两行创建了一个矩阵并向其添加了一个标量:

double** test = Matrix::init(3, 3);
Matrix::add_scal(test, 2.5);

最佳答案

循环不工作,因为 sizeof() 没有像您想象的那样工作。

您要求的是指针的大小,它在给定的机器上始终是一个常量(例如,在 32 位中为 4)。因此,当您询问 *arr**arr 的大小时,那将是一个数字,与维度无关矩阵!

为了自己验证这一点,打印它们,像这样:

std::cout <<sizeof(*arr) << " " << sizeof(**arr) << std::endl; 

阅读更多 Is the sizeof(some pointer) always equal to four?


为了遍历一个矩阵,你需要在你的例子中使用它的维度,rowscols,就像这样:

void Matrix::add_scal(double** arr, double s) {
    for (size_t x = 0; x < rows; ++x) {
        Serial.println("test");
        for (size_t y = 0; y < cols; ++y) {
            arr[x][y] += s;
        }
   }
}

PS:你正确地动态分配了矩阵,但是当你不再需要它时不要忘记释放内存——这是必须的!如果您不知道如何,请查看我的 dynamic 2D array in C++ .

提示:在 C++ 中,我强烈建议您使用 std::vector , 它会自动增大和缩小尺寸。此外,它有一个名为 size() 的方法。 ,返回它的大小,所以你不需要手动跟踪它的大小!

为了使用 vector 创建矩阵,请阅读 Vector of Vectors to create matrix .

关于c++ - 在 C++ 中使用 sizeof() 遍历二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53352933/

相关文章:

python - 使用 pandas 循环合并大量 csv 文件

c++ - boost::range 如何使用管道输入在 map 中插入元素

C++:从文件中读取并显示单个项目

arrays - 最大化可以从数组形成的所有非重叠子数组的最大和最小元素之间的绝对差之和?

java - 向后打印数组 - 不打印最后一个条目! - java

c++ - 显示数组中的最小值

c++ 使用 SetCursor 设置游标

c++ - 如何打开分区句柄以获取其在动态磁盘上的信息?

java - java中的else循环

python - 使用 join 时 Spark 迭代时间呈指数增长