Страница 76 из 82
Многомерные динамические массивы Многомерный массив в 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; |