КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Создание двуxмерного динамического массива
Операция new способна выделить память лишь под одномерный массив. А как быть, если массив двумерный? Наиболее удобный способ - это представить двумерный массив как массив из массивов, т.е каждую строку матрицы - как одномерный массив. При этом под каждую строку матрицы память будет выделена по отдельности, как под одномерный массив; и на нее потребуется отдельный указатель. Поскольку строк в матрице может быть много, указателей тоже будет много, и уже для их хранения потребуется вспомогательный массив из указателей. А так как количество строк в матрице переменного размера заранее неизвестно, то этот вспомогательный массив тоже будет динамическим, и сначала нужно выделить память под него. Декларировать при этом придется только указатель на вспомогательный массив; он будет, таким образом, указателем на указатель (**).
Пример. Создать динамическую матрицу размера n1 х n2. Присвоить каждому ее элементу значение, равное сумме номеров его строки и столбца: ... int **m, n1, n2; puts("Vvedite chislo strok i stolbtsov"); scanf(“%d%d”, &n1, &n2); m = new int * [n1]; // Захват памяти для массива указателей - // на рисунке А (n1=3) for (int i=0; i<n1; i++) // Захват памяти для каждого из
m[i] = new int [n2]; // массивов элементов (n1 таких массивов) // - на рисунке B (n2=4) ... for (i=0; i<n1; i++) for (j=0; j<n2; j++) m[i][j] = i+j; // *(*(m+i)+j) = i+j; ... for (i=0; i<n1; i++) // Освобождение памяти delete m[i]; delete m; ...
Устройство полученной "динамической матрицы" изображено на Рис. 19.1. Здесь имеется вспомогательный массив из 3 указателей и 3 массива для хранения данных, в каждом - по 4 элемента. Указатель m указывает на массив указателей, а каждый из указателей - на свою строку матрицы:
(А) (В) Рис. 4
Несмотря на сложность полученной схемы, работа с ней предельно проста. Обращение к элементу матрицы имеет точно такой же вид, как и к элементу "обычного" двумерного массива: m[i][j] а выделение и освобождение динамической памяти для матрицы стандартно и не зависит от конкретной задачи:
m = new int * [n1]; // Выделение памяти for (int i=0; i<n1; i++) m[i] = new int [n2];
...
for (i=0; i<n1; i++) // Освобождение памяти delete m[i]; delete m;
Преимущества динамических матриц: 1) Ее размер ограничен лишь размером доступной в данный момент памяти; 2) Под динамическую матрицу выделяется не больше памяти, чем требуется; 3) Ее строки могут быть не только одинаковой, но и разной длины (если нужно); 4) Чтобы поменять местами ее строки, не обязательно выполнять поэлементный обмен в цикле. Можно вместо этого переприсвоить указатели: int *w=m[0]; m[0]=m[1]; m[1]=w;
Хотя все элементы матрицы остались на месте, 0-ая и 1-ая строки всё же поменялись местами, т.к. m[0] указывает теперь на бывшую 1-ую строку (и наоборот), и значение m[0][i] будет таким, каким до обмена было m[1][i].
Дата добавления: 2014-01-07; Просмотров: 276; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |