下面發生了什麼?float arrayName [] []和float(* arrayNamePointer)之間的區別是什麼[]
以下是由C的Primer Plus的摘錄:
const float rain[YEARS][MONTHS] =
{
{ 4.3, 4.3, 4.3, 3.0, 2.0, 1.2, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6 },
{ 8.5, 8.2, 1.2, 1.6, 2.4, 0.0, 5.2, 0.9, 0.3, 0.9, 1.4, 7.3 },
{ 9.1, 8.5, 6.7, 4.3, 2.1, 0.8, 0.2, 0.2, 1.1, 2.3, 6.1, 8.4 },
{ 7.2, 9.9, 8.4, 3.3, 1.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 6.2 },
{ 7.6, 5.6, 3.8, 2.8, 3.8, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 5.2 }
};
int year, month;
float subtot, total;
printf(" YEAR RAINFALL (inches)\n");
for (year = 0, total = 0; year < YEARS; year++)
{
// for each year, sum rainfall for each month
for (month = 0, subtot = 0; month < MONTHS; month++)
{
subtot += rain[year][month];
}
printf("%5d %15.1f\n", 2010 + year, subtot);
total += subtot; // total for all years
}
我不得不改變這種使用指針,而不是數組下標。
所以我決定用:
[....]
float (* rainPointer)[2];
rainPointer = rain;
[....]
subtot += *(*(rainPointer + year) + month);
這適用於0年的年遞增正確與正確每月重置。但是,第一年並沒有指向我預期的目標。我經歷了這一百萬次,我將它們並排運行,rainPointer總是(在我眼中)看起來是正確的,年份和月份總是正確的。
我發現通過谷歌的答案,我應該使用:
subtot += *(*(rain + year) + month);
什麼是雨水和rainPointer之間有什麼不同?爲什麼它們不一樣,如果它們都指向兩個整數的開始?
發生了某些事情,我顯然沒有意識到或完全缺失。
它是'rainPointer'聲明的最內層數組維數是[[2]'而不是'[12]'還是'[MONTHS]')? – Wintermute 2015-04-05 16:17:06
不是我所知道的嗎?我可能會誤解,但就書中所述(並且該片段是逐字的),您必須聲明一個指向數組的指針,該數組必須指向具有兩個整數的數組的起始位置?我沒有解釋得那麼好。 – 2015-04-05 16:32:55
'int's似乎沒有涉及; 'rain'和'rainPointer'都涉及「浮動」數組。事情是:'rain'是每個12個'float'數組的數組,'rainPointer'是每個2個'float'數組的指針。它們並不完全兼容,只有在想要訪問數據時纔會這樣做,就好像它是在2D數組中放置的一樣(並且不關注嚴格的別名規則)。如果你想這樣做,那麼它聽起來好像你有預期的行爲。 – Wintermute 2015-04-05 16:37:17