Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Динамическое выделение памяти под многомерные массивы

Указатель на указатель или адрес адреса

 

Объявление в программе: int **point -означает, что переменная point используется для хранения адреса адреса. Указателю point при распределении памяти будет выделено также 4 байта. Проиллюстрируем возможность использования таких указателей следующей программой.

 

/* программа # 1.18 */

void main()

{

int a,*point_1,**point_2,***point_3;

 

a = 5;

point_1 = &a;/* инициализируем указатель адресом переменной а */

point_2 = &point_1; /* это адрес адреса переменной а */

point_3 = &point_2; /* это адрес адреса адреса переменной а */

***point_3 = 10; /* присваиваем переменной а значение 10 */

 

}

В последнем операторе выполняется запись числа по адресу адреса адреса переменной а. В этом примере показана простая, двойная и тройная косвенные адресации.

 

 

Часто двойная косвенная адресация используется для выделения памяти под двумерные массивы, тройная - под трехмерные и т. д. Программа # 1.19 иллюстрирует выделение памяти под двумерный массив типа float, возврат память OS и печать матрицы. Основная идея программы - представление двумерного массива как совокупности некоторого числа одномерных массивов- строк матрицы. Подробности содержатся в комментариях программы.

 

/* программа # 1.19 */

 

#include <vcl.h>

#include <conio.h>

#include <stdio.h>

#pragma hdrstop

#pragma argsused

 

// Протипы функций, используемых в программе

float ** Get_mem (int n, int m);

void Del_mem (float ** A, int n);

void print_matrix (float **A, int n, int m, char *format);

 

int main(int argc, char* argv[])

{

int n,m;

 

n =10; m=10;

float ** Matrix = Get_mem (n, m); // Выделяем память под двумерный массив //10*10

 

for (int i =0; i < n; i ++) // строим единичную матрицу- на главной диагонали, которой - единицы

for (int j =0; j < m; j ++)

if (i == j) Matrix [i][j]= 1.0;

 

print_matrix (Matrix, n, m, "%3.1f ");

 

Del_mem (Matrix,n); // Возвращаем память ОС

getch ();

 

return 0;

}

 

// Выделяем память для матрицы в n строк и m – столбцов

float ** Get_mem (int n, int m)

{

float ** buffer;

 

buffer = new float *[n]; // выделяем память под массив из n элементов. Этот //массив будет хранить адреса строк (массивов) матрицы. Поэтому в операторе //new тип данных float *(адреса данных типа float). Адрес данного массива записываем в переменную buffer, смысл которой - адрес адресов (массив указателей).

 

for (int i =0; i < n; i ++) // выделяем память n –раз под массивы из m //элементов - строки матрицы

buffer[i] = new float [m];

 

// Обнуляем матрицу

for (int i =0; i < n; i ++)

for (int j =0; j < m; j ++)

buffer[i][j] = 0.0;

 

return buffer; // возвращаем адрес массива указателей

}

 

// возвращаем память OS

void Del_mem (float ** A, int n)

{

for (int i =0; i < n; i ++) // удаляем память – строки матрицы

delete[] A[i]; // Так правильно удаляется память, выделенная под массив

// delete[]

delete[] A; // удаляем сам массив указателей

 

return;

}

 

// Вывод матрицы на экран

void print_matrix (float **A, int n, int m, char *format)

{

for (int i =0; i < n; i ++)

{

for (int j =0; j < m; j ++)

printf (format, A[i][j]);

printf ("\n");

}

return;

}

 

<== предыдущая лекция | следующая лекция ==>
Массив указателей | Лекция 7 – Нефтепромысловое оборудование
Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 631; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.