Что происходит внизу?В чем разница между 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. года приращение года правильно и месяц переустанавливает правильно. Тем не менее, год 1 не указывает, где бы я ожидал. Я прошел через это миллион раз, я запустил их бок о бок, rainPointer всегда (на моих глазах) кажется правильным, год и месяц всегда правильные.
Я нашел ответ через Google, я должен использовать:
subtot += *(*(rain + year) + month);
что различные между дождем и rainPointer? Почему они не совпадают, если оба указателя на начало массива из двух ints?
Что-то происходит, что я, очевидно, не осведомлен или полностью отсутствует.
Является ли это опечаткой, что 'rainPointer' объявляется с самым внутренним размером массива' [2] ', а не' [12] '(или' [MONTHS] ')? – Wintermute
Не то, что я знаю? Я мог бы ошибаться, но насколько сказано в книге (и этот фрагмент является дословным), вы должны объявить указатель на массив, который должен указывать на начало массива с двумя ints? Я не так хорошо объясняю. –
'int', похоже, не участвует; как 'rain', так и' rainPointer' относятся к массивам 'float'. Дело в том, что 'rain' представляет собой массив массивов из 12' float 'each, а' rainPointer' - указатель на массивы из 2 'float' each. Они не совсем совместимы, и вы делаете это только в том случае, если хотите получить доступ к данным, как если бы они были в другом, выстроенном 2D-массиве (и не заботились о строгих правилах псевдонимов). И если вы хотели это сделать, тогда это звучит так, как будто вы получили ожидаемое поведение. – Wintermute