Бьерн Страуструп.
Язык программирования С++
111
{
for ( int i = 0; i
for ( int j = 0; j<4; j++)
cout << ' ' << m[i][j];
cout << '\n';
}
}
Самый сложный случай - когда надо передавать обе размерности. Здесь "очевидное" решение просто
непригодно:
void print_mij(int m[][], int dim1, int dim2) //
ошибка
{
for ( int i = 0; i
for ( int j = 0; j
cout << ' ' << m[i][j];
cout
<<
'\n';
}
}
Во-первых, описание параметра m[][] недопустимо, поскольку для
вычисления адреса элемента
многомерного массива нужно знать вторую размерность. Во-вторых, выражение m[i][j] вычисляется как
*(*(m+i)+j), а это, по всей видимости, не то, что имел в виду программист. Приведем правильное
решение:
void print_mij(int** m, int dim1, int dim2)
{
for (int i = 0; i< dim1; i++) {
for (int j = 0; j
cout << ' ' << ((int*)m)[i*dim2+j]; //
запутано
cout
<<
'\n';
}
}
Выражение, используемое
для выбора элемента матрицы, эквивалентно тому, которое создает для
этой же
цели транслятор, когда известна последняя размерность. Можно ввести дополнительную
переменную, чтобы это выражение стало понятнее:
int* v = (int*)m;
// ...
v[i*dim2+j]
Лучше такие достаточно запутанные места в
программе упрятывать. Можно определить тип
многомерного массива с соответствующей операцией индексирования. Тогда пользователь может и не
знать, как размещаются данные в массиве (см. упражнение 18 в $$7.13).
Достарыңызбен бөлісу: