Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга C++.doc
Скачиваний:
24
Добавлен:
10.11.2019
Размер:
2.48 Mб
Скачать

Оператор указателя на структуру

Имя структуры обладает всеми правами имен типов, а следовательно, можно определять указатели на структуры:

имя_структуры *имя_указателя на структуру;

Как обычно, указатель можно проинициализировать. Значением указателя на структуру может быть адрес структуры того же типа, т.е. адрес байта, начиная с которого структура размещается в памяти. Структура задает размер объекта и тем самым определяет, на какую величину (на сколько байт) изменится значение указателя на структуру, если к нему прибавить (вычесть) 1.

Например,

// определение структуры Date

struct Date {

int day;

int month;

int year;

};

void main()

{

Date my_date, // определение переменной my_date типа Date

*birthday; // объявление указателя на объект типа Date

// инициализация указателя birthday адресом структуры my_date

birthday = &my_date;

// ...

}

В предыдущих разделах для доступа к элементам структуры мы использовали операцию точка (.). Операция точка обращается к элементу структуры по имени переменной объекта. Но, если у нас определен указатель на структуру, то появляется еще одна возможность доступа к элементам структуры. Ее обеспечивает оператор стрелка (->). Формат соответствующего выражения следующий:

имя_указателя->имя_элемента_структуры

Оператор стрелка, состоящий из знака минус (-) и знака больше (>), записанных без пробела, обеспечивает доступ к элементам структуры через указатель на объект.

Например,

// продолжение примера

/* используем операцию точка, чтобы инициализировать

элементы структуры my_date */

my_date.year = 2001;

my_date.month = 2;

my_date.day = 10;

/* используем операцию точка, чтобы вывести на экран

элементы структуры my_date */

cout << "The date is " << my_date.day

<< "/" << my_date.month << "/"

<< my_date.year << endl;

/* используем операцию стрелка, чтобы вывести на экран

элементы структуры my_date через указатель birthday*/

cout << "My birthday is " << birthday->day

<< "." << birthday->month << endl;

Выражение birthday->month эквивалентно (*birthday).month, которое разыменовывает указатель и делает доступным элемент month через оператор точка. Скобки нужны, т.к. оператор точка имеет более высокий приоритет, чем оператор разыменования указателя (*).

 

Как и для других объектов, для структур могут быть определены ссылки:

имя_структуры &имя_ссылки_на_структуру инициализатор;

Например, для переменной my_date можно, так ввести ссылку:

Date &now = my_date;

После такого определения now является синонимом имени пременной my_date. Для доступа к элементам структуры используется оператор точка.

Таким образом, следующие четыре выражения эквивалентны и обеспечивают доступ к элементу month переменной my_date типа Date.

my_date.month //по имени переменной

now.month // по ссылке

birthday->month // через указатель

(*birthday).month // через разыменованный указатель