Указатель на структурную переменную 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Указатель на структурную переменную



 

Описание шаблона структуры по существу новый тип, поэтому можно использовать указатель на введенный тип. Как и все указатели на данные, указатель на структурную переменную занимает либо два (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-02-05; просмотров: 288; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.193.158 (0.004 с.)