Вы можете принять double foo[20]
как массив 1 × 20, или как двумерный массив 4 × 5.Тогда у вас есть координаты, подобные этим:
foo foo+1 foo+2 foo+3 foo+4
foo+5 foo+6 foo+7 foo+8 foo+9
foo+10 foo+11 foo+12 foo+13 foo+14
foo+15 foo+16 foo+17 foo+18 foo+19
Так что если у вас есть функция, которая возвращает double *
, вы можете передать ее (или сделать так, чтобы она возвращалась) foo + 5*n
, чтобы указывать на строку n
.
#define ROW_LEN 5
#define ROWS 4
void fillRow(double * row)
{
int i;
for (i = 0; i < ROW_LEN; i++)
{
row[i] = 12;
(row + i) = 12; // this is the same thing written differently
}
}
double arr[ROW_LEN * ROWS];
fillRow(arr + 2 * ROW_LEN); // fill third row
Обратите внимание, что C вообще не выполняет никакой проверки диапазона, поэтому, если вы не будете осторожны и случайно с чем-то вроде arr[627] = 553
где-то в вашем коде, он будет слепо перезаписывать все, что находится наВычисляем адрес в памяти.