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

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

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

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

Например,

// опеределение структуры Datestruct 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 // через разыменованный указатель