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

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

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

Значением указателя на структуру является адрес структуры указанного типа, т.е. номер байта, начиная с которого структура размещается в памяти.

Например, используя определённый в предыдущем пункте тип и структурную переменную, можно так объявить указатель на структуру: tst*pS;

Инициализацию указателя на структуру можно выполнить одним из следующих способов.

a) Адрес структуры можно определить с помощью операции new. Это можно сделать вместе с объявлением

tst *pS1=new tst;

или раздельно

tst *pS1; pS1=new tst.

b) Можно определить указатель на другую структуру такого же типа pS2 иему присвоить значение адреса одной из ранее определённой структуры (S1, см. 2.1) такого же типа tst. Например,

tst*pS2 =&S1; или tst*pS2; pS2 =&S1;

c) Для инициализации указателя на структуру можно использовать ранее опредлённый указатель на структуру такого же типа:

tst *pS3=pS1; или tst *pS3; pS3=pS1;

d) Можно использовать имя предварительно объявленного статического массива структур:

const n=10; tst ars[n]; tst *pS4=ars; или tst *pS4; pS4=ars;

Для доступа к полям структуры с помощью указателей имеются две возможности.

1) Вместо операции “.” (точка) следует использовать операцию “–>” (стрелка). Она образована из знака “минус” и символа ”больше”, между которыми не должно быть пробелов. Например, pS1–>m=random(9)+2; определяет поле m с помощью датчика случайных чисел; pS1->t=new char[20]; резервирует память для строки. Создание динамического массива внутри структуры выполняется так:

pS1–>ard=new float [pS1–>m];

for (int j=0; j< pS1–>m; j++) cin>>(pS1–>ard[j]);

2) Вторая возможность — это разыменование указателя и формирование уточнённого имени по следующему правилу:

(*имя_указателя).имя_поля.

Например, (*pS).per=25.5; Важна правильная расстановка скобок. Операция разыменование (‘*’) должна относиться к имени указателя, а не к уточнённому имени элемента структуры.

Из двух приведенных возможностей чаще используется первая (см. например, визуальную систему Builder).

Но если в переменной указателе хранится адрес начала массива (pS4), то доступ к полю i – й структуры, т.е. i – го элемента этого массива осуществляется с использованием операции “.”(точка). Это связано с тем, что pS4 — это указатель, а pS4[i]i – я структура, а не адрес. Поэтому правильным будет следующий фрагмент программы:

for (int i=0; i<n;i++)

{ pS4[i].m=random(5)+1;

pS4[i].ard=new float [pS4[i].m];

for (int j=0; j< pS4[i].m; j++)

cin>>(pS4[i].ard[j]);

}

Здесь массив структур pS4 статический, а массив в структуре ard динамический.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: