Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Ii) Инициализация указателей

Напомним основные (предопределенные целиком или базовые, фундаментальные)типы данных | Еще о классе памяти | Некоторые операции | Еще о выражениях | Кратко: for, while, do-while циклы и простые примеры |


Читайте также:
  1. Алгоритм добавления и удаления опасных указателей
  2. Инициализация монохроматора
  3. Инициализация полихроматора.
  4. Объявление и инициализация ссылок
  5. Объявление указателей на функции
  6. Прямая инициализация полей в классе не допускается.

 

Указатель может быть инициализирован, в основном, тремя способами - (a),(b),(c):

 

(a) Присваиванием адреса переменной, например:

 

int * p;

int x;

//...

p = &x; // p указывает на x.

 

Указатель может быть объявлен с инициализацией

 

int x;

int *p = &x;

 

(b) Присваиванием указателю значения другого указателя:

 

int x;

int *p;

int *q = &x;

...

p = q; // p указывает на тот же объект, что и q

 

Обратите внимание на различие между следующими двумя случаями:

 

Пусть x = 2 и y – переменные типа int, p и q – указатели на int, и p = &x, q = &y. Тогда оба следующих оператора делают значение переменной, на которую, в результате, указывает q, равным 2:

 

*q = x; // y принимает значение x

 

или

 

q = &x; // q указывает на x (вместо y), значение y не изменилось

 

(c) При динамическом выделении памяти с использованием операции new (dynamic memory allocation):

 

int *p;

p = new int;

 

или, при объявлении с инициализацией указателя и переменной, которая создается:

 

int * p = new int(5);

 

В этом примере, p – указатель на область памяти под целочисленную переменную, инициализируемую значением 5.

 

Операция new создает, в ланном случае, анонимную переменную, хранимую в области памяти, называемой кучей (heap), и возвращает адрес этой переменной. К этой переменной можно обратиться только через указатель. Эта область памяти должна быть освобождена (если уже нет в ней необходимости) операцией delete. Важно вовремя разрушить объект, созданный операцией new в куче, и вернуть память в ОС. Попытка уничтожить операцией delete нечто, что не имеет выделенной под него области памяти, или освобождение одного и того же участка памяти в куче дважды, приведет к ошибке.

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

 

int * p = new int[10];

 

В этом случае, размер массива может быть переменной, определяемой во время выполнения программы. Такой вид массива называется динамическим массивом (dynamic array). Про объекты такого вида говорят, что они обладают динамической прдолжительностью существования (временем “жизни”), в отличие от локальной или статической продолжительности.

Заметим, что хотя мы иногда говорим, что p указывает на динамический массив в куче, в действительности, то на что указывает p есть первый элемент массива. Однпко, можно объявить указатель на “весь” массив, а реальную адресацию указателя осуществить позже.

 

Чтобы освободить память, выделенную ранее под динамический массив, мы пишем:

 

delete [ ] p;

 

Если указатель имеет значение NULL, операция delete или delete [ ] ничего не делает, и это не считается ошибкой, поскольку NULL – допустимое значение для указателя.

 

Тип Ссылка

 

Ссылочная переменная, или просто ссылка, есть альтернативное имя, псевдоним (синоним, алиас – alias) другой, уже существующей переменной, т.е., определяя переменную типа ссылка, мы определяем для некоторой переменной другое имя. Ссылки должны быть инициализированы при объявлении. Инициализатор является именующим выражением (l-value), которое дает адрес переменной. Когда объявляется переменная i, она получает связанный с ней адрес памяти. Когда объявляется переменная-ссылка j и инициализируется переменной i, она идентична i, в том смысле, что ничем не отличается от остальных имен этого объекта. Инициализация ссылки не есть присвоение ей значения – несмотря на форму записи, ни один оператор языка не выполняет действий над ссылкой.

 

int i;

int& j = i; // j и i два имени для одной и той же переменной

j = 2; // i принимает значение 2

 

 

Ссылки часто используются как параметры функций или для возвращения значений из функций. Эта тема будет обсуждена позже.

Ссылка может иметь константный тип. Инициализатор для const T& не обязан быть lvalue и даже иметь тип T. Константная ссылка может ссылаться на неконстантную переменную. В этом случае, переменная имеет два имени: одно есть константное имя, другое – неконстантное. Эта переменная не может быть модифицирована через константное имя:

 

int i = 3;

const int& n = i;

i = 5; // OK

// n = 7; не разрешено

 


Дата добавления: 2015-11-16; просмотров: 52 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Тип перечисление| Понятия области видимости идентификатора (и области действия идентификатора) имеют прямое отношение к, так называемым. пространствам имен.

mybiblioteka.su - 2015-2024 год. (0.007 сек.)