glu*_*gau 2 c++ arrays pointers multidimensional-array
我对 C++ 还很陌生,我一直在玩这种语言以试图理解它的大部分内容。我最近开始研究 2d 数组,我完全理解指向数组的指针数组(在堆上创建),但是我在使用下面的代码时遇到了困难。
int arr2d[3][2] = {
{1, 2},
{3, 4},
{5, 6}
};
Run Code Online (Sandbox Code Playgroud)
我知道在内存中,它充当一维数组,但我不明白指针如何与它们一起工作。我尝试将 arr2d 分配给 int 指针,但它不起作用。所以我尝试使用 auto 关键字。
int* a = arr2d; // throws an error
auto a = arr2d; // auto = int(*a)[2]
Run Code Online (Sandbox Code Playgroud)
在 Visual Studio 中将鼠标悬停在“a”上时,它给我类型 int(*a)[2]。这是我真的不明白的地方。
我已经查找了文档,但在任何地方都找不到这种语法。有人可以向我解释该指针类型的作用以及如何使用任何 n 维数组重新创建它吗?
谢谢!
这实际上非常有趣,而且您了解得越多,您C++就会发现它在所有情况下都变得完全无关紧要,但很少见。
int arr2d[3][2] = {
{1, 2},
{3, 4},
{5, 6}
};
Run Code Online (Sandbox Code Playgroud)
所以这里你有一个标识符 arr2d,这个标识符有一个类型:
数组数组
现在类型数组inC++与一个连续的对象块相关。所以你有一个连续块的连续块。
但是,当您在表达式中使用标识符时,规则C++说它会衰减为指向它是数组类型的数组 的第一个元素的指针(数组和称为“数组”的类型之间存在细微的区别)。
所以当你这样做时:
auto a = arr2d;
Run Code Online (Sandbox Code Playgroud)
那么标识符a现在是一个指针,因为arr2d已经衰减为指向您最初创建的 2D 数组的第一个元素的指针。但是指针的类型是什么?
它是一个指向数组数组第一个元素的指针。但是数组数组的第一个元素是一个数组——所以它是一个指向数组的指针。那是怎么写的C++语法?
像这样:
int (*)[2]; // see the right-left-rule
Run Code Online (Sandbox Code Playgroud)
C++语法可以是一门黑暗的艺术,没有一个像类型声明那样黑暗。它的复杂性在简单的情况下是隐藏的,int但是当事情变得复杂时,它会显示出它的金属性。
int (*)[2]; // see the right-left-rule
Run Code Online (Sandbox Code Playgroud)
这意味着一个指针(现在向右)指向类型为 2 个元素(现在向左)的数组int。
C++类型被声明为洋葱状,从右到左展开以允许统一的语法,能够声明从 an到一个函数的任何内容,int返回一个函数指针到一个函数,该函数返回一个指向函数指针数组的指针......等等。
请参阅:右左规则。
顺便说一句,您可以使用以下语法避免衰减到指向数组的指针:
auto a = &arr2d; // get the address of the whole 2D array
Run Code Online (Sandbox Code Playgroud)
您IDE应该显示如下内容:
int (*)[3][2]; // pointer to array-of-array-of-int
Run Code Online (Sandbox Code Playgroud)
你会像这样访问它:
(*a)[0][0] = 1; // dereference pointer to access 2D array it points to
Run Code Online (Sandbox Code Playgroud)
但我怀疑解决您的问题的更好方法是使用std::array. 这将表现得更可预测。
std::array<std::array<int, 2>, 3> arr2d = {{
{1, 2},
{3, 4},
{5, 6}
}};
auto a = &arr2d;
Run Code Online (Sandbox Code Playgroud)
现在a是类型std::array<std::array<int, 2>, 3>*