【问题标题】:How do pointers to 2d arrays work in C++?指向二维数组的指针如何在 C++ 中工作?
【发布时间】:2021-07-06 10:08:12
【问题描述】:

我对 C++ 还是很陌生,我一直在尝试使用该语言来尝试理解其中的大部分内容。 我最近开始研究 2d 数组,我完全理解指向数组的指针数组(在堆上创建),但我对下面的代码比较困难。

int arr2d[3][2] = {
    {1, 2},
    {3, 4},
    {5, 6}
};

我知道在内存中,它充当一维数组,但我不明白指针如何与它们一起工作。我尝试将 arr2d 分配给一个 int 指针,但它不起作用。所以我尝试了 auto 关键字。

int* a = arr2d; // throws an error
auto a = arr2d; // auto = int(*a)[2]

在 Visual Studio 中将鼠标悬停在“a”上时,它会给出 int(*a)[2] 类型。这是我真的不明白。

我已查找文档,但在任何地方都找不到此语法。有人可以向我解释一下该指针类型的作用以及如何使用任何 n 维数组重新创建它吗?

谢谢!

【问题讨论】:

  • n 维数组更好地实现为一维数组 (int*) 或向量,如果您要在 c++ 中执行它们。然后,您使用乘法对数组进行手动数组索引。如果这是您想要达到的目标?
  • 不,我只是想了解该语言的工作原理。我知道做数组的最好方法是做一维数组,但我只是好奇这些指针是什么。
  • 你需要一个指向 int 类型指针的指针,例如: int** a = arr2d;或者像悬停的代码一样,它是一个指向包含 2 个元素的 int 类型数组的指针。 a[0] 和 *a 将访问第一行, a[0][0] 和 *(*(a+0)+0) 与 **a 等价将访问第一行第一列。
  • @ai2ys 只能在 C 中工作 gcc 会为 C++ 发出警告。我的意思是int** a = arr2d;

标签: c++ arrays pointers multidimensional-array


【解决方案1】:

这实际上非常有趣,而且你对C++ 了解得越多,你就会发现它在几乎不常见的情况下变得越不相关。

int arr2d[3][2] = {
    {1, 2},
    {3, 4},
    {5, 6}
};

所以这里你有一个 identifier arr2d 并且那个 identifier 有一个类型:

数组数组

现在C++ 中的类型array 与一个连续的对象块相关。所以你有一个 连续块 连续块

但是,当您在 表达式 中使用标识符时,C++ 的规则会将其 衰减 变成指向第一个元素的 指针 类型数组 (数组和称为“数组”的类型之间存在细微差别)

所以当你这样做时:

auto a = arr2d;

好吧,标识符a 现在是一个指针,因为arr2d衰减成为指向您最初创建的二维数组的第一个元素的指针。但是指针的类型是什么?

它是一个指针,指向数组的数组的第一个元素。但是数组数组的第一个元素是一个数组——所以它是一个指向数组的指针C++ 语法是怎么写的?

像这样:

int (*)[2]; // see the right-left-rule

C++ 语法可能是一门黑暗的艺术,没有一个像声明类型那样黑暗。它的复杂性在 int 这样的简单情况下隐藏起来,但在事情变得复杂时显示出它的金属。

int (*)[2]; // see the right-left-rule

这意味着一个指针(现在向右)指向类型为 int 的 2 个元素(现在向左)的数组。

C++ 类型被声明为洋葱状,从右到左展开以允许统一的语法能够将 anythingint 声明为返回函数指针的函数,该函数返回一个函数指向函数指针数组的指针……等等。

请参阅:right-left-rule

顺便说一句,您可以使用以下语法避免衰减到 指向数组的指针

auto a = &arr2d; // get the address of the whole 2D array

您的IDE 应该显示如下内容:

int (*)[3][2]; // pointer to array-of-array-of-int

你可以这样访问它:

(*a)[0][0] = 1; // dereference pointer to access 2D array it points to

但我怀疑解决您的问题的更好方法是使用std::array。这将表现得更可预测。

std::array<std::array<int, 2>, 3> arr2d = {{
    {1, 2},
    {3, 4},
    {5, 6}
}};

auto a = &arr2d;

现在a 是类型std::array&lt;std::array&lt;int, 2&gt;, 3&gt;*

【讨论】:

    猜你喜欢
    • 2017-06-11
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2016-05-08
    • 1970-01-01
    相关资源
    最近更新 更多