在 C++ 中使用 sizeof() 循环二维数组 [重复]
Posted
技术标签:
【中文标题】在 C++ 中使用 sizeof() 循环二维数组 [重复]【英文标题】:Looping through 2D array using sizeof() in C++ [duplicate] 【发布时间】:2018-11-17 16:02:35 【问题描述】:我正在尝试编写一个小型 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;
“Test”只打印一次,内部循环根本不运行。这是我用来创建矩阵的函数:
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);
【问题讨论】:
好的,抱歉,您能否详细说明它的作用以及我是否仍然可以使用它获取数组中的元素数量? 数组不是指针,指针也不是数组。请改用std::array
或std::vector
。这两个都有一个size()
函数,您可以使用它来确定大小。
【参考方案1】:
循环不工作,因为sizeof()
没有像你想象的那样工作。
您正在询问指针的大小,它在给定的机器上始终是一个常量(例如,它在 32 位中是 4)。因此,当您询问 *arr
或 **arr
的大小时,这将是一个数字,与矩阵的维度无关!
为了自己验证这一点,打印出来,像这样:
std::cout <<sizeof(*arr) << " " << sizeof(**arr) << std::endl;
阅读更多Is the sizeof(some pointer) always equal to four?
为了循环一个矩阵,你需要使用它的维度,rows
和 cols
在你的情况下,像这样:
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 of Vectors to create matrix。
【讨论】:
非常感谢您的详细解释。由于这个问题,我想我可以像这样循环遍历数组:***.com/questions/8109961/… @derivmug 这应该会发出警告:warning: division 'sizeof (double*) / sizeof (double)' does not compute the number of array elements [-Wsizeof-pointer-div]
!不客气,很高兴我提供了帮助,如果有帮助,请不要忘记接受我的回答!
@derivmug 在array decaying 中阅读更多内容。以上是关于在 C++ 中使用 sizeof() 循环二维数组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 for 循环将一维数组的值放入 C++ 中的二维数组
哪个更好,单 for 循环或双 for 循环迭代二维数组? C++