对于一个2维数组声明如下:
double dataArray[15][20];
平整出来的版本,简直是以下几点:
dataArray[0];
如果你是存储第一的这个地址双成指针(地址变量)为双精度:
double * flatDataArray = dataArray[0];
下面的循环,例如,由于访问每一个元件以邻接方式,这样的事实,他们已在多维邻接的并且从未:
for (int i = 0; i < 15 * 20; i++) {
dataArray[0][i]; // alternatively: flatDataArray[i];
作为每编辑:更改所有double
到int
,或任何你想要的类型。
说,这是的char
S,这里怎么会变成什么样子,什么dataArray
,*dataArray
和**dataArray
将类似于:
char0 char1 ... char14 char15 char16 ... char29 ... char299
// > dataArray <
// > *dataArray < > <
// > < > <
// ^the **dataArray
的dataArray
可能得不到解除引用更多,两次最大。通过使用**dataArray
的地址,您的手上就会有*dataArray
。类似于*dataArray
。不适用于dataArray
,在这种情况下,您宁可简单地使用&dataArray
。
的&dataArray
每一个,dataArray
和*dataArray
将具有相同的值,这是char0
的地址,或跨越从char0
到char14
阵列,或阵列的跨越从char0-char14
到char285-char299
阵列。
**dataArray
将具有char0
的值。
其他三种有什么区别?那么,他们指向不同的类型,因此增加他们会有不同的解释。怎么样,当你增加一个整数的指针,你提前4个字节,而不是1
如果你碰巧由1递增&dataArray
,像&dataArray + 1
,你会提前300个字节(300 * sizeof(char)
)这是类似。如果您恰好将dataArray
加1(这是*dataArray
的地址),则会提前15个字节,依此类推。
如果您恰好将*dataArray
增加1,即**dataArray
,char0
的地址,则会提前1个字节。现在,这里是:
*dataArray
是dataArray[0]
- 递增1是
dataArray[0] + 1
- 那提领将
*(dataArray[0] + 1)
- 简写是
dataArray[0][1]
- 说我们是更增加它,总共15次
dataArray[0][15]
似乎是非法的,不是吗?好吧,事实并非如此,因为这部分内存仍在为你分配的部分。事实上,你可以远至dataArray[0][299]
。它只意味着提前299个字节,并访问该位置,并且该位置都是您的。
疯了,不是吗?我写了这么多关于它的更疯狂。我甚至不确定这是否会回答你的问题......我想因为getData(15, 20, dataArray[0]);
或getData(15, 20, *dataArray);
这样的电话会更合理,但我怀疑那里的类型转换会失败。
我希望这至少对某人有意义。
指针可用于遍历1维数组,但指向指针的指针不能用于迭代2维数组,这仅仅是数组的数组。建议阅读:[comp.lang.c常见问题](http://www.c-faq.com/)的第6部分。 –
@KeithThompson我相信,只要指针知道它指向一个*类型的n元素的数组,而不仅仅指向一个类型变量的指针。 – ThoAppelsin
问题是什么?函数将指针加倍而不是指向双精度数组的指针。 – this