Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методички.C++ / Конспект Лекций - Части 1,2.pdf
Скачиваний:
275
Добавлен:
24.02.2016
Размер:
1.97 Mб
Скачать

Пример программы конструирования массива массивов:

#include <stdio.h>

int x0[4]={ 1, 2, 3, 4}; int x1[4]={11,12,13, 14}; int x2[4]={21,22,23, 24}; int *y[3]={x0, x1, x2}; void main(void)

{int i,j;

for (i=0; i<3; i++) { printf("\n %2d)",i); for (j=0; j<4; j++)

}

}

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

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

//Создание массива указателей

printf(" %2d",y[i][j]);

Результаты работы программы:

0)1 2 3 4

1)11 12 13 14

2)21 22 23 24

Такие же результаты получим и при следующем объявлении массива:

int y[3][4]={

 

{ 1, 2, 3, 4},

 

{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.

Рассмотрим некоторые функции для манипулирования динамической памятью в стандарте Си:

43

void *calloc(unsigned n, unsigned size); – выделение памяти для размещения n объектов размером size байт и заполнение полученной области нулями; возвращает указатель на распределенную область памяти или NULL при нехватке памяти; coreleft (void) – получение размера свободной памяти в байтах (тип резуль-

тата: unsigned – для моделей памяти tiny, small и medium; unsigned long – для моделей памяти compact, large и huge;

void free (void *b) – освобождение блока памяти, адресуемого указателем b; void *malloc (unsigned n) – выделение области памяти для размещения блока размером n байт; возвращает указатель на распределенную область или NULL

при нехватке памяти; Пример создания одномерного динамического массива: 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 указатель;

Например: int *a;

a = new int (8);

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

delete a;

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

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

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

Операция delete:

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

44

Соседние файлы в папке методички.C++