我已经通过C++工作底漆,我觉得好像有什么东西还没有被解释清楚......什么是指向x个整数的数组的指针?
我明白它的意思有一个指针数组int
S,例如:
int *foo [4];
或
int *foo1 [2][4];
不过,我不明白是什么意思,有一个指针数组的一些int
s。下面是一本书的例子:
int ia[3][4];
int (*p) [4] = ia;
什么是p
这里了,这是什么意思,无论是在1D和2D情况?
我已经通过C++工作底漆,我觉得好像有什么东西还没有被解释清楚......什么是指向x个整数的数组的指针?
我明白它的意思有一个指针数组int
S,例如:
int *foo [4];
或
int *foo1 [2][4];
不过,我不明白是什么意思,有一个指针数组的一些int
s。下面是一本书的例子:
int ia[3][4];
int (*p) [4] = ia;
什么是p
这里了,这是什么意思,无论是在1D和2D情况?
当声明等
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
秒的数组。”这里的语法是不寻常的,但如果你想要一个指向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++,从未有过在任何地方看到这种情况的不幸,所以我认为将这一部分记录为“只有图书馆实施者需要担心的奇怪边缘情况”是安全的。 :-)
不。没有指向数组的指针。 – SergeyA
@SergeyA你确定吗?我相信我以前见过这种用法。我知道“它编译”是这样的一个糟糕的理由,但这在ideone.com编译:http://ideone.com/0olpbL – templatetypedef
是的,它编译。但是你最终会得到一个指向第一个元素的指针。 – SergeyA
int (*p) [4];
装置
p
是一个指针4个INT元素的数组。
通过括号覆盖规则,在这种情况下,指针*
优先于数组[]
。所以,p
首先是一个指针。
int ia[3][4];
int (*p) [4] = ia;
基本上这里p会保存ia矩阵每一行的起始地址。
p[0] = &ia[0];
...
生命期建议:始终使用适当的变量名称。例如:IntArray,MyPointer,My2dArray .. etc –
我认为这些变量名称只是为了表示目的而缩短的,因为这些例子来自book C++ primer,但是,我完全同意你的意思100% –
这是不可能的获取一个指向数组的指针。数组几乎总是衰减,指向它们的第一个元素。 – SergeyA