2016-11-15 93 views
1

我已经通过C++工作底漆,我觉得好像有什么东西还没有被解释清楚......什么是指向x个整数的数组的指针?

我明白它的意思有一个指针数组int S,例如:

int *foo [4]; 

int *foo1 [2][4]; 

不过,我不明白是什么意思,有一个指针数组的一些int s。下面是一本书的例子:

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

什么是p这里了,这是什么意思,无论是在1D和2D情况?

+0

生命期建议:始终使用适当的变量名称。例如:IntArray,MyPointer,My2dArray .. etc –

+0

我认为这些变量名称只是为了表示目的而缩短的,因为这些例子来自book C++ primer,但是,我完全同意你的意思100% –

+0

这是不可能的获取一个指向数组的指针。数组几乎总是衰减,指向它们的第一个元素。 – SergeyA

回答

4

当声明等

int array[137]; 

一个变量的变量arrayint[137]的类型;也就是一组137 int s。在C++中,您可以创建指向任何类型变量的指针或引用,以便您可以创建指向变量array的指针。由于array具有类型“137 int s的数组”,所以指向array的指针将具有类型“指向数组137 int s”的指针。写了这样一个指针的语法是

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]类型。那么,为什么我们可以分配myArray,其类型为int[137][42]?这是阵列到指针的衰减踢入。阵列到指针衰减是一种隐式转换,它将数组转换为指向其第一个元素的指针。让我们看看这是如何适用的。

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

此作业的净效果是arrayPtr现在指向myArray中的第137个数组。这简直太奇怪了,如果你问我,我不会建议这样写代码。我多年来一直在编写C++,从未有过在任何地方看到这种情况的不幸,所以我认为将这一部分记录为“只有图书馆实施者需要担心的奇怪边缘情况”是安全的。 :-)

+0

不。没有指向数组的指针。 – SergeyA

+0

@SergeyA你确定吗?我相信我以前见过这种用法。我知道“它编译”是这样的一个糟糕的理由,但这在ideone.com编译:http://ideone.com/0olpbL – templatetypedef

+0

是的,它编译。但是你最终会得到一个指向第一个元素的指针。 – SergeyA

0
int (*p) [4]; 

装置

p是一个指针4个INT元素的数组。

通过括号覆盖规则,在这种情况下,指针*优先于数组[]。所以,p首先是一个指针。

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

基本上这里p会保存ia矩阵每一行的起始地址。

p[0] = &ia[0]; 
...