Компания ALT Linux
Опубликован: 07.03.2015 | Доступ: свободный | Студентов: 1822 / 285 | Длительность: 24:14:00
Лекция 5:

Массивы

5.2 Динамические массивы в С(С++)

Для создания динамического массива необходимо [ "Предисловие" , "Строки в языке C++" ]:

  • описать указатель (тип * указатель;);
  • определить размер массива;
  • выделить участок памяти для хранения массива и присвоить указателю адрес этого участка памяти.

Для выделения памяти в С++ можно воспользоваться оператором new или функциями языка С — calloc, malloc, realloc. Все функции находятся в библиотеке stdlib.h.

5.2.1 Функция malloc

Функция malloc выделяет непрерывный участок памяти размером size байт и возвращает указатель на первый байт этого участка. Обращение к функции имеет вид:

void* malloc ( size_t size );

где size — целое беззнаковое значение1size_t — базовый беззнаковый целочисленный тип языка С/С++, который выбирается таким образом, чтобы в него можно было записать максимальный размер теоретически возможного массива любого типа. В 32-битной операционной системе size_t является беззнаковым 32-битным числом (максимальное значение 232- 1), в 64-битной — 64-битным беззнаковым числом (максимальное значение 264- 1)., определяющее размер выделяемого участка памяти в байтах. Если резервирование памяти прошло успешно, то функция возвращает переменную типа void*, которую можно преобразовать к любому необходимому типу указателя. Если выделить память невозможно, то функция вернёт пустой указатель NULL.

Например,

double *h; //Описываем указатель на double.
int k;
cin>>k; //Ввод целого числа k.
//Выделение участка памяти для хранения k элементов типа double.
//Адрес этого участка хранится в переменной h.
h=(double *) malloc ( k* sizeof ( double ) ); //h — адрес начала участка памяти,
//h + 1, h + 2, h + 3 и т. д. — адреса последующих элементов типа double

5.2.2 Функция calloc

Функция calloc предназначена для выделения и обнуления памяти.

void * calloc ( size_t num, size_t size );

С помощью функции будет выделен участок памяти, в котором будет храниться num элементов по size байт каждый. Все элементы выделенного участка обнуляются. Функция возвращает указатель на выделенный участок или NULL при невозможности выделить память.

Например,

float *h; //Описываем указатель на float.
int k;
cin>>k; //Ввод целого числа k.
//Выделение участка памяти для хранения k элементов типа float.
//Адрес этого участка хранится в переменной h .
h=( float *) calloc ( k, sizeof ( float ) ); //h — адрес начала участка памяти,
//h + 1, h + 2, h + 3 и т. д. — адреса последующих элементов типа float.

5.2.3 Функция realloc

Функция realloc изменяет размер ранее выделенного участка памяти. Обращаются к функции так:

void *realloc ( void *p, size_t size );

где p — указатель на область памяти, размер которой нужно изменить на size. Если в результате работы функции меняется адрес области памяти, то новый адрес вернётся в качестве результата. Если фактическое значение первого параметра NULL, то функция realloc работает так же, как и функция malloc, то есть выделяет участок памяти размером size байт.

5.2.4 Функция free

Для освобождения выделенной памяти используется функция free. Обращаются к ней так:

void free ( void *p );

где p — указатель на участок памяти, ранее выделенный функциями malloc, calloc или realloc.

5.2.5 Операторы new и delete

В языке С++ есть операторы new для выделения и delete для освобождения участка памяти.

Для выделения памяти для хранения n элементов одного типа оператор new имеет вид [5]:

x=new type [ n ];

type — тип элементов, для которых выделяется участок памяти;

n — количество элементов;

x — указатель на тип данных type, в котором будет храниться адрес выделенного участка памяти.

При выделении памяти для одного элемента оператор new имеет вид:

x=new type;

Например,

float *x; //Указатель на тип данных float .
int n;
cin>>n; //Ввод n
//Выделение участка памяти для хранения n элементов типа float. Адрес этого участка хранится
//в переменной x; x+1, x+2, x+3 и т. д. — адреса последующих элементов типа float.

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

delete [ ] p;

p — указатель (адрес участка памяти, ранее выделенного с помощью оператора new).

Сергей Радыгин
Сергей Радыгин

Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке?

Тип приложения - не Qt,

Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.

 

Юрий Герко
Юрий Герко

Кому удалось собрать пример из раздела 13.2 Компоновка (Layouts)? Если создавать проект по изложенному алгоритму, автоматически не создается  файл mainwindow.cpp. Если создавать этот файл вручную и добавлять в проект, сборка не получается - компилятор сообщает об отсутствии класса MainWindow. Как правильно выполнить пример?