Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1. Навроцкий А.А. Основы алгоритмизации и программирования в среде Visual C++.pdf
Скачиваний:
54
Добавлен:
26.03.2016
Размер:
3.6 Mб
Скачать

cout << *um << endl;

// Выводит: 1

um++;

 

cout << *um << endl;

// Выводит: 2

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

int *um, a[5] = {1,2,3,4,5};

um = a;

 

 

 

 

 

 

 

 

Р

cout << *um << endl;

// Выводит: 1

 

 

 

 

 

 

 

 

um += 3;

 

 

 

 

 

 

И

cout << *um << endl;

// Выводит: 4

 

 

 

У

 

 

 

 

 

 

 

 

 

 

Вычитание. Разность двух указателей равна числу объектов соответст-

вующего типа, размещенных в данном диапазоне адресов. Например:

int *um, a[5] = {1,2,3,4,5};

 

Г

 

 

 

um = &a[0];

 

 

 

 

Б

 

 

 

 

un = &a[4];

 

 

 

 

 

 

 

 

k = un - um;

 

 

 

 

 

 

cout << k << endl; //

Выводит: 4

 

 

 

 

 

 

 

 

 

к

 

 

 

 

Операции сравнения. Сравниваютдресаобъектов.

 

 

 

 

 

7.3. Инициализация указателей

 

 

 

 

 

 

т

 

 

 

 

 

Инициализация пустым знач ни м. Например:

 

 

 

int *a = NULL;

 

е

 

 

 

 

int *b = 0;

о

 

 

 

 

 

 

 

 

и

 

 

 

 

 

 

 

Присваиван е

указателю адреса уже существующего объекта. Например:

int k = 23;

 

 

 

 

 

 

 

 

int *uk = &k;

// ли

int *uk(&k);

 

 

 

 

 

б

 

 

 

 

 

 

 

 

 

int *us = uk;

 

 

 

 

 

 

 

 

ти

 

 

 

 

 

 

 

 

 

Присваиваниелуказателю адреса выделенного участка динамической

памя :

 

 

 

 

 

 

 

 

 

 

Б

 

 

 

 

 

 

 

 

 

 

int *s = new int;

int *k = (int *) malloc(sizeof(int));

В примере использована операция sizeof, которая определяет размер указанного параметра в байтах.

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

Динамическая память (heap) – специальная область памяти, в которой во время выполнения программы можно выделять и освобождать место в соответствии с текущими потребностями. Доступ к выделяемым участкам памяти осу-

43

ществляется через указатели. Для работы с динамической памятью в языке Си (библиотека malloc.lib) определены следующие функции:

void *malloc(size) – выделяет область памяти размером size байт. Возвращает адрес выделенного блока памяти. Если недостаточно свободного места для выделения заданного блока памяти, то возвращает NULL.

void *сalloc(n, size) – выделяет область памяти размером n блоков по size байт. Возвращает адрес выделенного блока памяти. Если недостаточно свобод-

 

Р

ного места для выделения заданного блока памяти, то возвращает NULL. Вся

выделенная память заполняется нулями.

И

void *realloc(*u) – изменяет размер ранее выделенной памяти, связанной

с указателем u на новое число байт. Если память под указатель не выделялась,

 

 

 

 

 

У

то функция ведет себя как malloc. Если недостаточно свободного места для вы-

деления заданного блока памяти, то функция возвращает значение NULL.

 

 

 

Б

 

void free(*u) – освобождает участок памяти, связанный с указателем u.

В языке C++ для выделения и освобожденияГпамяти определены опера-

 

 

туда

 

 

ции new и delete. Имеются две формы операций:

 

 

 

к

 

 

 

тип *указатель = new тип (зн чение) – выделение участка памяти в

е

 

 

указанного значения.

соответствии с указанным типом и занесение

 

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

т

 

 

 

 

 

тип *указатель = new ип[n] – выделение участка памяти размером n блоков указанного типа.

delete []указатель – освобождение выделенной памяти.

 

и

 

Операция delete не уничтожает значения, связанные с указателем, а раз-

решает компи ятору спользоватьо

данный участок памяти.

б

 

 

7.5.лСоздание одномерного динамического массива

следующиеДля создания одномерного динамического массива необходимо знать тип элементов массива и их количество. Например, для создания одномерного ди-

намБческого массива, состоящего из n действительных чисел, можно использовать функции:

umas1 = static_cast <double*> (malloc(n*sizeof(double)));

(освобождение памяти – free(umas1) )

или

umas1 = static_cast <double*> (сalloc (n,sizeof(double)));

(освобождение памяти – free(umas1) )

или

44

umas1 = new double(n*sizeof(double));

(освобождение памяти – delete umas1 )

или

umas1 = new double[n];

(освобождение памяти – delete []umas1 )

7.6. Создание двумерного динамического массива

Двумерный динамический массив рассматривается компилятором как

массив указателей на одномерные массивы (рис. 7.1).

 

 

 

Р

 

 

 

 

 

 

 

 

 

 

 

 

 

И

 

 

 

 

 

 

 

 

У

 

 

 

 

 

 

 

Г

 

 

 

 

 

 

 

Рис. 7.1

Б

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

е

 

массив указателей, затем

Вначале выделяется память под одномерныйа

каждый указатель получает адр с созданногокодномерного динамического мас-

сива. Освобождение памяти осущ ствля тся в обратном порядке.

 

double **umas2;

 

 

// Объявление указателя на массив

umas2 = new double*[n];

// Выделение памяти

 

 

и

т

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

 

 

л

 

 

// Выделение памяти

 

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

 

 

б

 

 

 

 

 

 

 

 

 

umas2[i] = new double[m];// под одномерные массивы

и

 

// Работа с массивом

 

 

 

 

 

 

 

 

 

 

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

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

delete []umas2[i];

// под одномерные массивы

 

Бdelete []umas2;

 

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

 

 

 

 

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

 

 

umas2 = NULL;

// Очистка указателя

 

 

 

45

8. Функции пользователя

8.1. Понятие функции

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

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

тип_возвращаемого_значения имя_функции (список_параметров)

Первая }строка данного описания называется заголовком функцииР. Тип

{

Тело_функции

возвращаемого значения может быть любым, кроме массива илиИфункции. Если функция не возвращает значение, то указывается тип void. В С++ по умолчанию тип возвращаемого результата − int.

 

 

 

 

У

Список параметров представляет собой набор конструкций следующей

формы:

 

 

Г

тип_параметра имя_параметра

Б

 

Например:

 

 

 

 

 

 

 

int sum(int a, double b, char c)

 

 

 

 

а

 

Если функция не получает ни а их данных, то скобки остаются пустыми:

int fun()

к

 

 

 

 

 

 

Широко использую ся про

о ипы функций (их предварительное объяв-

 

е

 

 

 

ление). Прототип аналогичен заголовку функции, за исключением того, что

имена формальных параме р в не указываются (остаются только типы), и в

конце ставится точка с запяттй:

int sum(int, doubleо, char);

Широкое испо ьзование прототипов вызвано следующим:

 

и

имеющие прототипы функции могут быть вызваны из других модулей;

спользованиел

прототипов позволяет размещать функции в произ-

вольном порядке (а не до первого их использования);

б

 

 

Биразмещение прототипов в одном месте делает программу более читабельной.

Правила оформления тела функции такие же, как и для любого другого участка программы. Все объявления носят локальный характер, т. е. объявленные переменные доступны только внутри функции.

Не допускается вложение функций друг в друга.

Выход из функции происходит при достижении закрывающей функцию скобки или после выполнения оператора return.

46