Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C_lect.doc
Скачиваний:
18
Добавлен:
12.11.2018
Размер:
856.06 Кб
Скачать

Динамические массивы

Память для массива может выделяться и уничтожаться динамически с помощью специальных функций, например, для выделения памяти могут использоваться функции: malloc, calloc, realloc, а для освобождения памяти функция free (в Си++ существуют специальные операторы new и delete). Особенно это удобно в том случае, когда число элементов заранее не известно, а становится известным только во время выполнения программы, например, число элементов может вычисляться при работе программы, вводится с клавиатуры и т.д.

Функция malloc имеет заголовок, определенный в заголовочном файле stdlib.h:

void * malloc(unsigned int _Size);

Данная форма заголовка является упрощенной, функция имеет один параметр, определяющий размер выделяемой динамически области памяти в байтах, функция возвращает указатель на выделяемую область памяти, тип указателя void *, что обеспечивает его неявное приведение к указателям на любые стандартные типы.

Возвращает выделенную память обратно операционной системе функция с упрощенным заголовком (заголовочный файл stdlib.h):

void free(void * _Memory);

Функция имеет один параметр – указатель на блок освобождаемой памяти.

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

#include <stdio.h>

#include <stdlib.h>

void main()

{

int *p; // Указатель, может быть использован для выделения памяти под массив динамически

int n; // Заранее неизвестное число элементов массива

int i; // Индексная переменная

printf("n="); scanf("%d", &n); // Ввод с клавиатуры числа элементов массива

p=malloc(n*sizeof(int)); // Выделяем память под массив динамически

// Заполняем массив случайными числами и печатаем его

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

{

p[i]=rand() % 100; // Получаем псевдослучайное целое число в интервале

// 0..99

printf("%d ", p[i]);

}

free(p); // Возвращаем выделенную память операционной системе, когда она не нужна

}

5.3.2. Многомерные массивы

Многомерный массив – это массив массивов.

Пример определения:

int A[2][3];

Данное определение можно раскрыть следующим образом: А – массив из двух элементов, элементами массива являются массивы из трех элементов типа int.

Элементы следуют в памяти в следующем порядке:

A[0][0], A[0][1], A[0][2], A[1][0], A[1][1], A[1][2]

Обращаться к элементам массива можно с помощью индексного выражения или с помощью указателей

A[0][1]=5;

A[i][j]=i+j; // или

*(*(A+i)+j)=i+j;

Инициализация многомерных массивов

Инициализация многомерных массивов может проводиться по аналогии с одномерными массивами. Например:

int A[2][3][2]={ 1, 2, 3, 4, 5};

Инициализируются первые 5 элементов по их расположению в оперативной памяти, т.е. элементы с индексами: 000, 001, 010, 011, 020

Но удобнее использовать вложенные фигурные скобки, при этом самая левая размерность может не указываться, а определяться по умолчанию:

int B[][5]={{ 1, 2, 3} , { 6, 7} , { 1, 2, 3, 4, 5 }};

В примере создается массив размерности 3 × 5 (аналог матрицы 3 × 5, при этом в первой строке инициализируются 3 элемента, во второй – 2 элемента, в третьей – все 5 элементов).

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