Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
кр 1 вариант 5.doc
Скачиваний:
10
Добавлен:
01.04.2014
Размер:
259.58 Кб
Скачать

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

После окончания работы с массивом, когда выделенная ранее память перестанет быть нужной, ее необходимо освободить, чтобы дать возможность операционной системе использовать эту память по своему усмотрению, например, выделить другой программе. Для этого используется унарный оператор delete, единственный операнд которого — адрес, по которому начинается память, ранее выделенная оператором new, которую мы хотим освободить. Например:

delete pi;

При этом сам указатель pi не уничтожается, ему можно присвоить новое значение, однако разыменование этого указателя может привести к ошибке.

Общая схема

Теперь объединим все вышесказанное в одну программу, создающую в динамической памяти массив типа double, заполняющую его данными и уничтожающую в конце.

int n; // Размер массива

double * p; // Указатель на начало массива

cout<<"Введите размер массива: ";

cin>>n;

p=new double[n]; // Выделяем память

if(p==0) // Проверка успешности выделения памяти

{

cout<<"Невозможно выделить память"<<endl;

return 1; // Завершаем работу

}

for(int i=0;i<n;++i) // Цикл для считывания массива

cin>>p[i]; // Считали i-й элемент массива

//// Теперь выполняем что-нибудь с массивом

delete p; // Освобождаем память

Операции над указателями

Указателям можно присваивать значение, являющееся указателем того же типа (которое может быть результатом оператора new, оператора & или другим указателем того же типа). К указателям можно применять оператор разыменования *. Кроме этого с указателями можно выполнять ряд других операций. Далее мы предполагаем, что p и q — указатели одного типа, например, объявленные как int *p, *q.

Как и числа, указатели можно сравнивать между собой.

p==q

Проверка двух указателей на равенство (то есть указывают ли они на одну и ту же ячейку памяти) 

p!=q

Проверка на неравенство 

p<q

Возвращает true, если ячейка, на которую указывает p находится в памяти раньше, чем ячейка, на которую указывает q. Аналогично определяются сравнения p<=q, p>q, p>=q

Как всегда, нельзя путать операторы проверки на равенство p==q и присваивания p=q. В результаты выполнения оператора присваивания p будет указывать туда же, куда и q, значения же ячеек памяти, на которые указывали p и q не изменятся.

К указателям можно прибавлять и вычитать целые числа. Пусть p указывает на начало массива. Тогда p+0 равно p, p+1 — это указатель на следующий элемент массива, то есть &p[1], и для любого положительного i p+i — это указатель на p[i]. Вычитание из указателя 1 (а также прибавление к указателю -1) возвращает указатель на переменную, которую можно разместить в памяти непосредственно перед переменной, на которую указывает p.

Если p указывает не на начало массива, а на произвольную ячейку памяти, к значению p можно прибавлять целые числа, при этом результат будет такой же, как описано выше.

Также к указателям можно применять оператор доступа к элементам массива []: p[0] при этом означает переменную, хранящуюся в ячейке памяти, на которую указывает p, p[1] — следующую за ней, а p[-1] — предшествующую ей и т.д.

Поскольку определены операторы сложения и вычитания указателя с целыми числами, то указателям можно применять операции инкремента ++, декремента --, а также увеличивать (+=) и уменьшать -= значения указателей на целые значения.

Наконец, два указателя одного типа можно вычитать друг из друга. В этом случае оператор вычитания p-q возвращает целое число, при прибавлении которого к указателю q получается указательp.

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

  1. Вложенные структуры и массивы структур.

Объявление структур

Структура – это составной тип данных, в котором под одним именем объ-единены данные различных типов. Отдельные данные структуры называются полями. Объявление структуры осуществляется с помощью ключевого слова struct, за которым идет ее имя и далее список элементов, заключенных в фи-гурные скобки:

struct имя

{

тип_элемента_1 имя_элемента_1;

тип_элемента_2 имя_элемента_2;

...

тип_элемента_n имя_элемента_n;

} ;

Правила работы с полями структуры идентичны работе с переменными со-ответствующих типов. К полям структуры можно обращаться через составное имя. Формат обращения:

имя_структуры.имя_поля

или

указатель_на_структуру>имя_поля

Структурой в языке C называется совокупность логически связанных переменных различных типов, сгруппированных под одним именем для удобства дальнейшей обработки.

Структура – это способ связать воедино данные разных типов и создать пользовательский тип данных. В языке Pascal подобная конструкция носит название записи.

Соседние файлы в предмете Основы алгоритмизации и программирования