什么是指向x数量的整数数组的指针?

时间:2016-11-15 18:26:15

标签: 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情况下意味着什么?

3 个答案:

答案 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];
...