我一直在研究 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/