Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций(ОАиП).doc
Скачиваний:
70
Добавлен:
11.05.2015
Размер:
1.07 Mб
Скачать

12.7. Адресная функция

Использование многомерных массивов в языке Си связано с расходами оперативной памяти на массивы указателей.

Можно избежать таких расходов, если ввести адресную функцию для доступа к элементам одномерного массива (цепочка одномерных массивов со значениями) по значениям индексов многомерного массива. Например, адресная функция для следующего трехмерного массива x(1..n1, 1..n2, 1..n3) выглядит следующим образом:

L(i, j, k)=n1*n2*(i-1) + n2*(j-1)+k,

где индексы принадлежат диапазонам: i=1..n1, j=1..n2, k=1..n3.

Для размещения такого массива требуется область оперативной памяти размером n1*n2*n3*(число байт отводимых компилятором для одного элемента массива в зависимости от типа данных). Рассматривая такую область как одномерный массив y размером n1*n2*n3 можно установить соответствие элемента массива х элементу памяти для его размещения:

x(i, j, k)=y(L(i, j, k));

Так как массивы являются данными сложного (составного) типа, операции над ними желательно выполнять, используя стандартные библиотечные функции, например, для объявленных массивов: type x[100], y[100]; операция присваивания:

memcpy(x,y,sizeof(x)); - содержимое массива y присвоить содержимому массива x.

13. Работа с динамической памятью

В языке С размерность массива при объявлении должна задаваться константным выражением. При необходимости работы с массивами перемен­ной размерности вместо массива достаточно объявить указатель требуемого типа и присвоить ему адрес свободной области памяти (захватить память). После обработки массива занятую память надо освободить. Библиотечные функции работы с памятью описаны в файле alloc.h.

Пример создания динамического массива:

float *x;

int n;

printf("\nРазмерность - "); scanf(" %d",&n);

if ((x = calloc(n, sizeof(*x)))==NULL) { // Захват памяти

printf("\n Предел размерности “);

exit(1);

}

else {

printf("\n Массив создан !");

...

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

printf("\n%f",x[i]);

...

free(x); // Освобождение памяти

}

В С++ введены две операции: захват памяти - new, освобождение, захваченной ранее памяти - delete.

Общий формат записи:

указатель = new type (значение);

. . .

delete указатель;

Например:

int *a;

a = new int (8);

В данном случае создана целочисленная динамическая переменная, на которую установлен указатель a и которой присвоено начальное значение 8. После работы с ней освобождаем память:

. . .

delete a;

Операции new и delete для массивов:

указатель = new тип [количество] ;

Результат операции – адрес начала области памяти для размещения данных, указанного количества и типа. При нехватке памяти – результат NULL. Операция delete:

delete [ ] указатель;

13.1. Пример создания одномерного динамического массива:

Массив объявляем указателем.

...

double *x;

int i, n;

...

puts(" Введите размер массива: ");

scanf(“%d”, &n);

x = new double [n] ;

if (x == NULL) {

puts(" Предел размерности ! ");

return;

}

for (i=0; i<n; i++) // Ввод элементов массива

scanf(“%lf”, &x[i]);

...

delete [ ]x; // Освобождение памяти

...