c++ - 什么是指向 x 个整数数组的指针?

标签 c++ arrays pointers

我一直在研究 C++ Primer,我觉得好像有些东西没有解释清楚...

我理解拥有指向 int 的指针数组意味着什么,例如:

int *foo [4];

int *foo1 [2][4];

但是,我不明白拥有一个指向由一定数量的 int 组成的数组 的指针是什么意思。这是书中的一个例子:

int ia[3][4];
int (*p) [4] = ia;

这里的 p 是什么,在 1D 和 2D 情况下这意味着什么?

最佳答案

当你声明一个变量时

int array[137];

变量array的类型是int[137];即,一个包含 137 个 int 的数组。在 C++ 中,您可以创建指向任何类型变量的指针或引用,因此您可以创建指向变量 array 的指针。由于 array 的类型为“137 个 int 的数组”,因此指向 array 的指针的类型为“指向 137 个 的数组的指针”整数。”像这样写出指针的语法是

int (*arrayPtr)[137] = &array;

这读作“arrayPtr 是一个指针,它指向的是一个包含 137 个 int 的数组。”这里的语法很不寻常,但如果您想要一个指向包含 137 个整数的数组的指针,您就会这样做。

同样,您可以像这样对 array 进行引用:

int (&arrayRef)[137] = array;

在任何地方实际使用指向数组的指针是极其罕见的——除了在非常特殊的模板环境中,我从未见过它被使用过。 对数组的引用有时会在模板编程中使用,但我以前从未见过它们在任何地方使用过。

换句话说,知道它们的存在并知道如何阅读它们是件好事,但实际上您不太可能需要它们,除非您开始进行一些非常高级的库开发或喜欢使用模板魔法。

当您将数组到指针的衰减考虑在内时,这会变得更奇怪。您拥有的示例代码本质上是

int myArray[137][42];
int (*arrayPtr)[42] = myArray;

arrayPtr的类型是“指向42个int数组的指针”,类型为int (*) [42]。那么,为什么我们可以将类型为int[137][42]myArray 赋值给它呢?这就是数组到指针衰减的用武之地。数组到指针衰减是一种隐式转换,它将数组转换为指向其第一个元素的指针。让我们看看它是如何应用在这里的。

myArray 是一个包含 42 个整数的 137 个数组的数组。这可以看作是“一个包含 137 个元素的数组,每个元素都是一个 int[42]”。这意味着当数组到指针衰减应用于 myArray 时,它会转换为指向其第一个元素的指针。该元素本身是一个包含 42 个整数的数组,因此应用数组到指针衰减的效果是表达式 myArray 隐式转换为 int (*) [42](指向 42 个整数数组的指针),具体来说,一个指向数组中第一行的指针。

此赋值的最终效果是 arrayPtr 现在指向 myArray 中 137 个数组中的第一个。如果你问我,这很奇怪,我不建议编写这样的代码。多年来我一直在编写 C++,从来没有不幸看到它在任何地方被使用,所以我认为将它归结为“只有库实现者需要担心的奇怪的边缘情况”是安全的。 :-)

关于c++ - 什么是指向 x 个整数数组的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40617112/

相关文章:

c# - 是否可以在 C# 中扩展数组?

C错误: `arithmetic on pointer to an incomplete type`

c++ - 将 unsigned char* 转换为 unsigned char**(不带 &)

c++ - 将类的成员函数传递给 pthread_cleanup_push() 时没有匹配的函数调用

python - Fortran:灵活的数组过滤

php - 使用一维数组中的数据通过算法创建多维数组

c - 如何理解函数中的指针

c - 如何找到数组的大小(从指向数组第一个元素的指针)?

c++ - 哪个更快 : Stack allocation or Heap allocation

c++ - unique_ptr 的奇怪用法