我一直在使用 C ++ Primer 工作,我觉得好像还没有解释清楚......
我理解拥有指向int
的指针数组意味着什么,例如:
int *foo [4];
或
int *foo1 [2][4];
但是,我不明白指向某些int
个数组的指针是什么意思。这是本书的一个例子:
int ia[3][4];
int (*p) [4] = ia;
这里的p
是什么,这在1D和2D情况下意味着什么?
答案 0 :(得分:4)
声明类似
的变量时int array[137];
变量array
的类型是int[137]
;也就是说,一个137 int
s的数组。在C ++中,您可以创建指向您想要的任何类型的变量的指针或引用,因此您可以创建指向变量array
的指针。由于array
具有类型为“137 int
s的数组”,因此指向array
的指针将具有“指向137 int
s的数组的指针”。写出这样的指针的语法是
int (*arrayPtr)[137] = &array;
这被解读为“arrayPtr
是一个指针,它指向的是一个137 int
s的数组。”这里的语法是不寻常的,但如果你想要一个指向137个整数数组的指针,你就会这样做。
同样,你可以像这样对array
进行引用:
int (&arrayRef)[137] = array;
看到指向数组的指针实际上在任何地方使用都是非常罕见的 - 除非在非常专业的模板环境中,否则我从未见过它。 引用有时会在模板编程中使用,但在其他地方我从未见过它们。
换句话说,知道这些存在并知道如何阅读它们是很好的,但实际上你不太可能需要它们,除非你开始做一些非常高级的库开发或喜欢玩模板魔法。
当你将数组到指针衰减到混合中时,这会变得更加怪异。您拥有的示例代码基本上是
int myArray[137][42];
int (*arrayPtr)[42] = myArray;
arrayPtr
的类型是“指向42 int
s的数组的指针”,其类型为int (*) [42]
。那么为什么我们可以为其分配myArray
类型int[137][42]
?这是数组到指针衰减开始的地方。数组到指针衰减是一种隐式转换,它将数组转换为指向其第一个元素的指针。让我们看看这是如何适用的。
myArray
是一个包含42个整数的137个数组的数组。这可以是“137个事物的数组,每个事物都是int[42]
。”这意味着当数组到指针衰减应用于myArray
时,它会转换为指向其第一个元素的指针。该元素本身是一个由42个整数组成的数组,因此应用数组到指针衰减的效果是表达式myArray
隐式转换为int (*) [42]
(指向42个整数数组的指针) ,具体来说,一个指向数组中的第一行。
此分配的净效果是arrayPtr
现在指向myArray
中137个数组中的第一个。如果你问我,这简直很奇怪,我不建议像这样编写代码。我多年来一直在编写C ++,并且从来没有遇到过在任何地方使用C ++的不幸,所以我认为将这一点归结为“只有图书馆实施者需要担心的奇怪边缘情况”是安全的。 : - )
答案 1 :(得分:0)
p
装置
*
是一个指向4个int元素数组的指针。
通过括号覆盖规则,在这种情况下,指针[]
的优先级高于数组p
。因此,{{1}}起初是一个指针。
答案 2 :(得分:0)
int ia[3][4];
int (*p) [4] = ia;
基本上这里p将保存ia矩阵的每一行的起始地址。
p[0] = &ia[0];
...