【问题标题】:C++ 2D Array and functions [closed]C ++ 2D阵列和功能[已关闭]
【发布时间】:2021-02-02 01:15:32
【问题描述】:

我正在学习 C++,我是 C++ 的初学者。如果我在主函数中声明数组,如 char arr [10][10],如何更改函数中的数组(int fun(..))。

#include <iostream>
using namespace std;
int func(....);
int main(){
   char arr[10][10];
   ...
   return 0;
}

【问题讨论】:

  • C++ 中的数组很棘手。您能否非常具体地说明您希望它的行为方式?尽可能精确。您现在的问题非常模糊,正确的答案是“请了解数组的工作原理”。
  • 这能回答你的问题吗? Passing a 2D array to a C++ function
  • 在 C++ 中,您有多种选择。我建议您开始使用std::array,因为它可以简化很多事情。
  • 这也可能有帮助(std::array):stackoverflow.com/questions/30263303/…

标签: c++ arrays


【解决方案1】:

让我们先把一些东西拿出来; using namespace std;main 中的 return 0; 和 C 样式的数组在现代 C++ 中是不鼓励的。重写代码以使用推荐的样式会产生以下结果:

#include <iostream>
#include <array>

int func(....);

int main(){
   std::array<std::array<char, 10>, 10> arr;
   ...
}

类型写起来比较繁琐,所以我们可以做个别名:

template<typename T>
using TenByTenArray = std::array<std::array<T, 10>, 10>;

现在声明变得更具可读性:

TenByTenArray<int> arr;

所以我们的函数现在可以轻松地引用该类型:

int func(TenByTenArray<int> & arr) {
    // use arr to modify it
}

制作一个完整的示例程序:

#include <iostream>
#include <array>

template<typename T>
using TenByTenArray = std::array<std::array<T, 10>, 10>;

void func(TenByTenArray<int> & arr) {
    for (int x = 0; x < 10; x++) {
        for (int y = 0; y < 10; y++) {
            arr[x][y] = x + y*100;
        }
    }
}

int main(){
   TenByTenArray<int> arr;
   func(arr);
   std::cout << arr[4][2] << std::endl;
}

【讨论】:

  • 而不是TenByTenArray,我会使用Array2D&lt;int, 10, 10&gt; 之类的东西,这样它是一种适用于所有尺寸的类型,而且打字不多。甚至可能有一个模板允许任意数量的维度,尽管我认为这需要一些令人难以置信的递归特征结构,所以可能不是最容易解释的!
  • @underscore_d 这仅用于示例,实际别名将取决于必要的用例。如果任何阅读 cmets 的人都想要,那就是 template&lt;typename T, unsigned x, unsigned y&gt; using Array2D = std::array&lt;std::array&lt;T, y&gt;, x&gt;; N 维变体甚至超出了这里的评论部分的范围。
  • using namespace std;, return 0; in main 和 C 风格的数组”——其中哪一个不像其他的?提示:仅仅因为你可以省略return 0; 并不意味着你应该这样做。
  • 是的,我认为建议省略 return 0 并不好,除了使惰性代码有效之外,AFAICT 没有任何充分的理由被允许......这可能会让新手思考他们可以在其他地方省略返回值并获得“默认”值。
  • @underscore_d 你会在别处得到一个胖警告。我不想在这里辩论这个(再次,这个评论部分的主题) - 我觉得在简短的例子中节省额外的一行是值得的。我几乎从不使用返回码,因为我很少编写命令行工具。对于所有其他用例,返回代码将被忽略,您将以其他方式将结果通知给用户。从这个意义上说,程序的默认退出是成功的,这对我来说“更正确”,而不是在返回 int 的函数上弯曲规则(无论如何这在其他方面都很特殊)。
【解决方案2】:

假设你想使用 C 数组,那么通常的答案是

int func(char (*ptr)[10]);

注意ptr 是一个指针,不可能将C 数组传递给C++(或C)中的函数。这是不在 C++ 程序中使用 C 数组的一个很好的理由(还有其他的)。

您还可以在 C++ 中通过引用传递 C 数组

int func(char (&ptr)[10][10]);

与上面的指针解决方案不同,这对数组尺寸没有灵活性,它必须是 10 x 10。

另一种可能性是将数组作为结构的一部分传递。

struct Array10by10
{
    char data[10][10];
};

int func(Array10by10 arr);

如果这一切看起来有点复杂,并且由于您正在学习 C++,那么您确实应该学习更简单的 C++ 方法,即使用类模板 std::arraystd::vector 代替C 数组。

【讨论】:

  • @idclev463035818 我想我现在涵盖了所有内容。
  • “如果这一切看起来有点复杂,”那么因为它是;)。作为初学者,我的问题是,一旦我知道如何传递 C 数组,我就太自豪了,以至于没有意识到实际上不需要它。
猜你喜欢
  • 2013-07-14
  • 1970-01-01
  • 2013-05-08
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 2020-12-09
  • 1970-01-01
相关资源
最近更新 更多