- •1Содержание
- •Теоретическая часть.
- •Объявление указателя
- •Операции над указателями
- •Создание указателей
- •Выделение памяти
- •Создание массива при помощи оператора new
- •Проверка значения, возвращаемого new
- •Освобождение памяти
- •Общая схема
- •Операции над указателями
- •Вложенные структуры
- •Массивы структур
- •Практическая часть.
- •Список использованных источников
Выделение памяти
Для того, чтобы создать в памяти новую переменную используется оператор new. Это унарный оператор, единственный операнд которого должен быть именем типа создаваемой переменной. Оператор new возвращает адрес вновь созданной переменной, который можно присвоить указателю. Например:
int * pi; // Объявление переменной pi
pi=new int; // Выделение памяти для переменной pi
Для доступа к ячейке памяти, адрес которой хранится в указателе, необходимо использовать унарный оператор разыменования, записываемый символом *. Пример:
*pi=5; // *pi - разыменование указателя pi
cout<<(*pi); // Будет напечатано 5
В этом примере ячейке, на которую указывает pi сначала присваивается число 5, а потом значение этой ячейки памяти выводится на экран. Присвоить числовое значение непосредственно указателю (pi=5) нельзя!
Также указателю можно присвоить адрес уже существующей переменной, для этого к переменной нужно применить унарный оператор взятия адреса & :
int a, b, *p; // a и b имеют тип int, p - указатель на int
a=3;
p=&a; // Теперь p указывает на a
cout<<*p; // Будет выведено 3
p=&b; // Теперь p указывает на b
*p=7; // В результате будет изменено значение b
cout<<b; // Будет выведено 7
Создание массива при помощи оператора new
Для создания массива в динамической памяти используется оператор new с указанием размера создаваемого массива. Пример:
int * pi; // Объявить указатель pa
pi=new int[n]; // Создать массив из n элементов типа int
Теперь с pi можно работать, как с обычным массивом из n элементов типа int: становятся доступны элементы pi[0], pi[1], ..., pi[n-1].
Проверка значения, возвращаемого new
Существует единственное числовое значение, которое можно присвоить непосредственно указателю: это 0 (то есть присваивание pi=0 разрешено, а присваивание pi=1 — нет). Нулевой адрес — особый, по этому адресу не может хранится ни одна переменная. То есть указатель, имеющий нулевое значение указывает в "никуда", к такому указателю нельзя применить оператор разыменования.
Оператор new использует функцию операционной системы для выделения памяти. Если затребованный размер памяти слишком большой (а также при попытке создать массив из нуля или отрицательного числа элементов), операционная система не будет выделять память и оператор new вернет нулевое значение. Если это нулевое значение будет присвоено указателю, к которому впоследствии будет применен оператор разыменования или оператор обращения к элементу массива, то программа аварийно завершит работу с ошибкой segmentation fault. Чтобы быть уверенным, что оператор new был выполнен удачно, необходимо сразу после его вызова проверить значение, которое он вернул и в случае, если оно равно 0, выполнить какие-либо особенные действия, например, вывести сообщение о невозможности выделения необходимого объема памяти. Например:
int n=1000000000;
int *pi=new int[n];
if(pi==0)
{
cout<<"Невозможно создать массив из "<<n<<" элементов int";
return 1; // Завершаем работу функции main
}