對於一個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