Указатели на структуры

Указатели могут указывать и на структурный тип данных:

 

struct Point{

int x,y;

} r, *p;

p=&r;

 

Для обращения к полю структуры через указатель придется писать не только звездочку, но и скобки (т.к. операция "точка" имеет приоритет выше, чем "звездочка" ):

 

(*p).x=3; // r.x=3

(*p).y=4; // r.y=4

 

Ввиду распространенности подобного действия, в языке С введена специальная сокращенная запись операции доступа к полям структур и объединений при помощи указателей:

 

-> (стрелка);

 

Она означает разадресацию указателя на структуру, стоящего слева от знака ->, и переход к полю этой структуры, указанному справа от ->. Поэтому вышеприведенный пример присваивания значений полям структур можно записать и короче:

 

p->x=3;

p->y=4;

 

В сущности, подобная операция уже давно знакома читателю: все стандартные компоненты C++ Builder'а являются как раз указателями на структуры (точнее, на объекты - структуры, объявленные вместе с обрабатывающими их функциями). Поэтому, например, выражение Edit1->Text означает переход от указателя Edit1 (имеющего тип TEdit * ) к самому объекту (имеющему тип TEdit) и его полю Text .

 

Сказанное иллюстрируется следующим примером:

 

Edit1->Text="A";

Edit2->Text="B";

Edit1=Edit2; // Edit1 теперь указывает на 2-ой Edit !

Edit1->Text="C";

 

В результате первый Edit сохранит значение "A", а второй получит значение "C". Отметим, что после выполнения этого фрагмента программы и Edit1 и Edit2 указывают на второй Edit, и любые операции и с Edit1 , и с Edit2 будут относиться к нему; к первому же Edit'у вообще не осталось доступа из программы вплоть до завершения ее работы.

Присваивание указателей на компоненты С++ Builder'а может быть полезно, например, если компонент C++ Builder'а сделать аргументом при вызове функции.