【问题标题】:Passing a dynamic multidimensional array on the stack to a function C++ [closed]将堆栈上的动态多维数组传递给函数 C++ [关闭]
【发布时间】:2023-04-04 02:22:01
【问题描述】:

我刚刚参加了当地大学的考试,他们要求我基本上做一个探路者。我被卡住了,因为我真的想将二维数组传递给一个函数。还没想出堆分配双指针的想法,不过现在想来,好像不能像这样传下去真的很难看 int function(int matrix[][]); 或者 int function(int& matrix[][]); 类似的东西。这种限制背后的逻辑是什么?没有malloc,有没有办法在堆栈上做到这一点?
编辑
该数组是动态的,我被限制使用任何包装器,包括标准库中的包装器

【问题讨论】:

  • 传递多维std::arraystd::vector。忘记 C 风格的数组或将数组作为指针+大小传递 - 在 C++ 中,我们有更好的选择。请不要在 C++ 程序中使用malloc
  • 限制在C中也是一样的,怎么知道数组的维数?因此,在 C++ 中,您使用向量或矩阵类,在 C 中,您将使用 int** 并传递宽度和高度。
  • 我不明白为什么大学仍在教授严重过时的 C++98。让我难过☹️
  • @Galik std::array 与 C 样式数组一样快。如果您需要动态数组,如果您想击败 std::vector,您将面临真正的挑战。真的没有借口在 C++ 中使用 C 样式数组。

标签: c++ function multidimensional-array stack


【解决方案1】:

将二维数组传递给函数

首先要意识到函数参数不能是数组。将数组传递给函数的典型方法是传递指向数组元素的指针。

在二维数组的情况下,数组的元素是一维数组。这是一个例子:

int function(int matrix[][4]);

int main() {
    int m[4][4];
    function(m);
}

没有malloc

几乎没有理由在 C++ 中使用 malloc

如果第二维不是 const 怎么办

那么它不能是多维数组。数组元素的类型必须是编译时常量。由于大小是数组类型的一部分,这意味着多维数组的内部维度必须是编译时常量。 (此外,最外层维度也必须是编译时常量,除非数组是动态分配的)。

实现数学上多维结构的技巧是将它们表示为一维数组,其中内部维度的每一行都在前一行之后(这也是多维数组类型的实现方式;内存是一维的) .如果行的宽度相同,则可以使用以下公式将多维索引转换为展平索引:

flat_index = dim1_index + dim2_index * row_size

【讨论】:

  • 不回答 OP 的问题,因为他有动态大小。
  • 所以,如果我没听错的话,我必须使用指向指针数组的指针作为参数(我所说的双指针是什么意思,例如 int** 矩阵)?
  • @Anton 是的,请参阅我在上一条评论中提到的副本。
  • @MatthieuBrucher 这可以采用指向任意大小数组的指针。但它只能接受一个指向 4 个整数数组元素的指针。
  • 完全正确,因此是正确的副本。由于您是 C++ 金牌徽章,因此您可以删除错误答案并将其作为正确的副本关闭。
猜你喜欢
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
相关资源
最近更新 更多