gpt4 book ai didi

c++ - 如何在 C++ 中指向数组的数组?

转载 作者:搜寻专家 更新时间:2023-10-31 00:38:10 28 4
gpt4 key购买 nike

我有一个 4D 数组,我想创建一个函数,我可以使用它来引用 4D 数组中的 2D 数组,并通过在函数调用中附加带有索引的方括号来读取它的数据。

int numbers[2][3][4][4] = {
{
{{1,2,3,4}, {4,3,2,1}, {6,7,8,9}, {9,8,7,6}},
{{0,1,0,1}, {1,0,1,0}, {1,1,0,0}, {0,0,1,1}},
{{5,4,1,8}, {4,2,5,1}, {7,2,5,8}, {4,2,5,1}}
},
{ /* same stuff */ }
};

例如,如果我只想访问 {4,2,5,1},我可以创建一个函数,返回指向该数组第一个整数的指针(&number[0][2][1][0 ]),并使用 func()[1]、func()[2]、func()[3] 访问元素,嗯……你知道的。

int* func() {
return &numbers[0][2][1][0];
}

// func()[2] => 5

但是我怎样才能创建一个返回对数字 [0][2] 的引用的函数,所以例如我可以执行 func()[1][0] 并且它会返回 5 ?

看来我应该加深对 C/C++ 指针、引用和数组的理解,但我也会欣赏“std”和特定于 C++11 的解决方案(在标准数组上使用一些很酷的 std::class)。谢谢:)

最佳答案

  1. 在 C++ 中,最好的方法是返回一个二维数组的引用

    int (&func())[4][4] {
    return numbers[0][2];
    }

    现在您可以访问它了

    func()[i][j]

    这完全保留了二维数组类型并保留了自然访问语法。

  2. 如果您坚持返回一个指针,那么您可以返回一个指向该二维数组中第一个一维数组的指针

    int (*func())[4] {
    return numbers[0][2];
    }

    这会将访问语法保留为

    func()[i][j]

    但是,如您所见,其代价是二维数组类型衰减为一维数组类型。

  3. 或者,如前所述,您可以返回一个指向二维数组的指针

    int (*func())[4][4] {
    return &numbers[0][2];
    }

    但在这种情况下,您必须记住访问二维数组元素为

    (*func())[i][j]

    即它保留了二维数组类型,但迫使您使用更复杂的访问语法。

出于这个原因,引用似乎是最好的方法(只要您坚持使用原始数组),它结合了两种基于指针的方法的“最佳”特性。

附言对 2D 数组类型进行类型定义将产生更具可读性的函数声明。例如。如果你这样做

typedef int Numbers2D[4][4];

然后第一个变体会变成

Numbers2D &func() {
return numbers[0][2];
}

关于c++ - 如何在 C++ 中指向数组的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18622199/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com