В C 2-мерные массивы - это просто аккуратная схема индексации для 1-мерных массивов. Как и в случае с одномерным массивом, двумерные массивы выделяют один блок непрерывной памяти, а запись A[row][col]
аналогична высказыванию A[row*NCOLS+col]
.
Обычно, если бы вы реализовали свои собственные многомерные массивы с использованием одномерных массивов, вы бы написали функцию индексации:
int getIndex(int row, int col) { return row*NCOLS+col; }
Если ваш компилятор встроит эту функцию, производительность здесь будет точно такой же, как если бы вы использовали встроенную «функцию индексации» двумерных массивов.
Для иллюстрации:
#define NROWS 10
#define NCOLS 20
Это:
int main(int argc, char *argv[]) {
int myArr[NROWS*NCOLS];
for (int i=0; i<NROWS; ++i) {
for (int j=0; j<NCOLS; ++j) {
myArr[getIndex(i,j)] = i+j;
}
}
return 0;
}
Должен работать так же, как это:
int main(int argc, char *argv[]) {
int myArr[NROWS][NCOLS];
for (int i=0; i<NROWS; ++i) {
for (int j=0; j<NCOLS; ++j) {
myArr[i][j] = i+j;
}
}
return 0;
}
Хотя, как AraK указал , если вы много перепрыгиваете по строкам, а строки очень большие, вы можете столкнуться с большим количеством ошибок страниц ... в этом В этом случае может помочь пользовательская индексная функция (с переключенными строками и столбцами), но может просто изменить, какое из измерений в двумерном массиве вы рассматриваете как строки, а какие - как столбцы.