C++. Бархатный путь. Часть 1. Страница 76.
Многомерные динамические массивы
Многомерный массив в C++ по своей сути одномерен. Операции new[] и delete[] позволяют создавать и удалять динамические массивы, поддерживая при этом иллюзию произвольной размерности. Деятельность по организации динамического массива требует дополнительного внимания, которое окупается важным преимуществом: характеристики массива (операнды операции new) могут не быть константными выражениями. Это позволяет создавать многомерные динамические массивы произвольной конфигурации. Следующий пример иллюстрирует работу с динамическими массивами.
#include <iostream.h>
// Одноимённые функции. Различаются списками списками параметров.
// Это так называемые перегруженные функции. О них позже.
int fdArr(int **, int, int);
int fdArr(int ***, int, int, int);
void main()
{
int i, j;
/* Переменные (!) для описания характеристик массивов.*/
int dim1 = 5, dim2 = 5, dim3 = 10, wDim = dim2;
/* Организация двумерного динамического массива производится
в два этапа. Сначала создаётся одномерный массив указателей,
а затем каждому элементу этого массива присваивается адрес
одномерного массива. Для характеристик размеров массивов
не требуется константных выражений. */
int **pArr = new int*[dim1];
for (i = 0; i < dim1; i++)
pArr[i] = new int[dim2];
pArr[3][3] = 100;
cout << pArr[3][3] << endl;
fdArr(pArr,3,3);
/* Последовательное уничтожение двумерного массива */
for (i = 0; i < dim1; i++)
delete[] pArr[i];
delete[] pArr;
/* Организация двумерного "треугольного" динамического массива.
Сначала создаётся одномерный массив указателей, а затем каждому
элементу этого массива присваивается адрес одномерного массива.
При этом размер (количество элементов) каждого нового массива
на единицу меньше размера предыдущего. Заключённая в квадратные
скобки переменная в описателе массива, которая, в данном контексте,
является операндом операции new, позволяет легко сделать это. */
int **pXArr = new int*[dim1];
for (i = 0; i < dim1; i++, wDim--)
pXArr[i] = new int[wDim];
pXArr[3][3] = 100;
cout << pArr[3][3] << endl;
fdArr(pXArr,3,3);
/* Последовательное уничтожение двумерного массива
треугольной конфигурации */
for (i = 0; i < dim1; i++)
delete[] pXArr[i];
delete[] pXArr;
/* Создание и уничтожение трёхмерного массива требует дополнительной
итерации. Однако здесь также нет ничего принципиально нового. */
int ***ppArr;
ppArr = new int**[dim1];
for (i = 0; i < dim1; i++)
ppArr[i] = new int*[dim2];
for (i = 0; i < dim1; i++)
{
for (j = 0; j < dim2; j++)
ppArr[i][j] = new int[dim3];
}
ppArr[1][2][3] = 750;
cout << ppArr[1][2][3] << endl;
fdArr(ppArr,1,2,3);
for (i = 0; i < dim1; i++)
{
for (j = 0; j < dim2; j++)
delete[]ppArr[i][j];
}
for (i = 0; i < dim1; i++)
delete[] ppArr[i];
delete[] ppArr;
}
int fdArr(int **pKey, int index1, int index2)
{
cout << pKey[index1][index2] << endl;
}
int fdArr(int ***pKey, int index1, int index2, int index3)
{
cout << pKey[index1][index2][index3] << endl;
}