- •1Содержание
- •Теоретическая часть.
- •Объявление указателя
- •Операции над указателями
- •Создание указателей
- •Выделение памяти
- •Создание массива при помощи оператора new
- •Проверка значения, возвращаемого new
- •Освобождение памяти
- •Общая схема
- •Операции над указателями
- •Вложенные структуры
- •Массивы структур
- •Практическая часть.
- •Список использованных источников
1Содержание
I . Теоретическая часть:
1. Операции над указателями.
2. Вложенные структуры и массивы структур
II . Практическая часть
III. Список использованных источников
Теоретическая часть.
Операции над указателями.
Объявление указателя
Для всех переменных выделяются участки памяти размером, соответст-вующим типу переменной. Программист имеет возможность работать непо-средственно с адресами, для чего определен соответствующий тип данных – указатель. Указатель имеет следующий формат:
тип *имя указателя
Например:
int *a; double *b, *d; char *c;
Знак «звездочка» относится к имени указателя. Значение указателя соот-ветствует первому байту участка памяти, на который он ссылается. На один и тот же участок памяти может ссылаться любое число указателей.
В языке Си существует три вида указателей:
1. Указатель на объект известного типа. Содержит адрес объекта опреде-ленного типа.
2. Указатель типа void. Применяется, еcли тип объекта заранее не определен.
3. Указатель на функцию.
Операции над указателями
Над указателями можно провести две унитарные операции:
1. & (взять адрес). Указатель получает адрес переменной. Данная опера-ция применима к переменным, под которые выделен соответствующий участок памяти.
2. * (операция разадресации). Предназначена для доступа к величине, расположенной по данному адресу.
Над указателями можно выполнять арифметические операции сложения, инкремента, вычитания, декремента и операции сравнения. При выполнении арифметических операций с указателями автоматически учитывается размер данных, на которые он указывает.
Указатели, как правило, используются при работе с динамической памя-тью (heap, или «куча»). Для работы с динамической памятью в языке Си опре-делены следующие функции: malloc, сalloc, realloc и free.
В языке C++ для выделения и освобождения памяти определены операции new и delete соответственно. Используют две формы операций:
1. Тип *указатель = new тип (значение) – выделение участка памяти в соответствии с указанным типом и занесение туда указанного значения.
delete указатель – освобождение выделенной памяти.
2. Тип *указатель = new тип[n] – выделение участка памяти размером n блоков указанного типа.
3. delete [ ]указатель – освобождение выделенной памяти.
Часто размер используемого при решении задачи массива не задан на момент компиляции программы, а определить его можно только при выполнении программы. В этом случае используется механизм, называемый динамическим распределением памяти. Для использования динамического распределения памяти необходимо создать переменную специального типа, называемую указателем, затем создать в памяти массив необходимого размера, доступ к которому будет осуществляться через этот указатель, наконец, освободить выделенную память после завершения работы с массивом.
Создание указателей
Указатель — это переменная специального типа. Она хранит не какое-то числовое значение, а адрес (номер первого байта в памяти компьютера), по которому хранится какая-то другая переменная. При создании указателя необходимо задать тип переменной, на которую он указывает. Синтаксис объявления указателя такой:
имя_типа * идентификатор;
Пример:
int * pi;
float * pf, f;
double * ps, * pt;
В первой строке этого примера объявлены переменная pi, являющейся указателем на тип int (то есть в ячейке памяти, на которую указывает pi должна хранится переменная типа int). Во второй строке объявлены переменная pf, являющейся указателем на тип float и переменная f типа float. Обратите особое внимание на эту строчку: для того, чтобы объявить несколько указателей в одной строке, необходимо перед идентификатором каждого из них поставить символ *. А еще лучше объявлять в одной строке только одну переменную. В третей строке объявляется два указателя на тип double: ps и pt.
Сразу после объявления значение указателя не определено, то есть он может указывать в произвольную ячейку памяти, поэтому пользоваться им нельзя. Иначе вы в лучшем случае получите ошибку segmentation fault, в худшем — программа будет работать непредсказуемо.