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

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

Для того, чтобы создать в памяти новую переменную используется оператор 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

}

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