MyTetra Share
Делитесь знаниями!
Многомерные динамические массивы
Время создания: 23.07.2009 22:03
Текстовые метки: C, C++
Раздел: Компьютер - Программирование - Язык C++ (Си++)
Запись: xintrea/mytetra_syncro/master/base/0000001132/text.html на raw.github.com

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;

}




Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования