Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OAiP_Konspekt_lektsy.pdf
Скачиваний:
33
Добавлен:
11.05.2015
Размер:
843.37 Кб
Скачать

{11,12,13,14},

// Декларация и инициализация

{21,22,23,24},

// массива массивов целых чисел

};

 

В последнем случае массив указателей на массивы создается ком- пилятором. Здесь собственно данные массива располагаются в памяти последовательно по строкам, что является основанием для объявления

массива y в виде

 

int z[3][4]={ 1, 2, 3, 4,

 

11,12,13,14,

// Декларация и инициализация

21,22,23,24};

// массива массивов целых чисел

Замена скобочного выражения

z[3][4] на z[12] здесь не допускается, так

как массив указателей в данном случае создан не будет.

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 тип (значение);

. . .

delete указатель;

43

PDF created with pdfFactory Pro trial version www.pdffactory.com

Например: 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;

// Освобождение памяти

...

 

13.2. Пример создания двухмерного динамического массива

Напомним, что ID двухмерного массива - указатель на указатель

(рис. 4):

...

int **m, n1, n2, i, j;

puts(" Введите размеры массива (количество строк и столбцов: "); scanf(“%d%d”, &n1, &n2);

m = new int * [n1];

// Захват памяти для указателей «А» (n1=3)

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

// Захват памяти для элементов «B» (n2=4)

m[i] = new int [n2];

. . .

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

for ( j=0; j<n2; j++)

44

PDF created with pdfFactory Pro trial version www.pdffactory.com

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]