КАТЕГОРИИ: Архитектура-(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; }
Дата добавления: 2014-01-05; Просмотров: 680; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |