Указатель на структурную переменную
Описание шаблона структуры по существу новый тип, поэтому можно использовать указатель на введенный тип. Как и все указатели на данные, указатель на структурную переменную занимает либо два (near), либо четыре (far) байта. Для доступа к полям структурной переменной через указатель используется операция ->. Выражение
указатель_на_структуру->имя_поля
эквивалентно обычной записи
(*указатель_на_структуру).имя_поля
Приведем пример описания указателя на структурную переменную, инициализации указателя и его использования для ссылки на отдельные поля структурной переменной:
/* Prim8_2.cpp*/
struct UDC{char class, subclass; int number;};
struct BOOK{
struct UDC udc_class;
char name[20];
char title[44];
int year; float price;
};
struct BOOK *ptr_book, first_book;
ptr_book = &first_book;
ptr_book->year = 1992;
ptr_book->udc_class.class = ‘A’;
ptr_book->udc_class.number = 681;
strcpy(ptr_book->title, "Белый Бим Черное Ухо");
scanf("%f", &ptr_book->price);
Ссылка на поле структурной переменной через указатель обладает всеми свойствами обычной переменной. Например, если поле – это массив символов, то ptr_book->title – это указатель-константа на первый элемент массива. Можно определить адрес первого байта поля структурной переменной обычной операцией взятия адреса. Например, &ptr_book->price – это адрес первого байта поля price. Естественно, что ссылка на поле структурной переменной через указатель может располагаться как слева, так и справа от знака операции присваивания. Например, если описан шаблон BOOK и сделано описание данных:
struct BOOK *ptr_book, first_book;
ptr_book = &first_book;
то ссылка (*ptr).year эквивалентна ссылке first_book.year и ссылке ptr_book->year.
Заслуживает внимания то, как осуществляется доступ к полям вложенной структуры. Например, для того, чтобы сослаться на поле class вложенной переменной по шаблону struct UDC, сначала используют операцию ->, а затем ссылку на поле вложенной структуры операцией ‘.’:
ptr_book->udc_class.class = ‘A’;
Используя указатель на структурную переменную, можно сделать ссылку на поле любого типа, в том числе, например, на указатель. Отметим, что указатель на структуру может использоваться до объявления шаблона структуры, так как компилятору не требуется информация о размере структуры, а размер самого указателя известен. Далее приведен пример доступа к полям структуры с использованием указателя на структуру UDC, являющегося полем структуры BOOK:
/* Prim8_3.cpp */
struct BOOK{
struct UDC *udc_class; // указатель
char name[20];
char title[44];
int year;
float price;
};
struct UDC{
char class, subclass;
int number;
} my_class;
struct BOOK *ptr_book, first_book;
ptr_book = &first_book;
ptr_book->udc_class = &my_class;
ptr_book->udc_class->class = ‘A’;
ptr_book->year = 1992;
ptr_book->udc_class->number = 681;
strcpy(ptr_book->title, "Белый Бим Черное Ухо");
scanf("%f", & ptr_book->price);
В приведенном примере структурная переменная first_book, созданная по шаблону struct BOOK, включает в себя поле udc_class. Оно представляет собой указатель на структурную переменную по шаблону struct UDC. Сам шаблон struct UDC описан после описания указателя udc_class. Операция присваивания
ptr_book->udc_class = &my_class;
записывает в поле udc_class адрес первого байта структурной переменной my_class. После этого можно ссылаться на поля переменной udc_class через указатель ptr_book, например, так:
ptr_book->udc_class->class = ‘A’;
Указатели на структурные переменные широко используются для доступа к структурам, размещаемым в диамически выделяемой памяти, при создании вложенных структур данных – списков, стеков, деревьев и пр., для передачи в качестве фактических аргументов функциям.
Дата добавления: 2017-01-29; просмотров: 447;