Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛекцииЛаб(Часть_1_Книги).doc
Скачиваний:
7
Добавлен:
03.05.2019
Размер:
1.04 Mб
Скачать

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

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

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

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

Например, используя определённый в предыдущем пункте тип и структурную переменную, можно так объявить указатель на структуру: 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 динамический.

2.3. Динамический массив структур

Из объявления tst *arSd; ещё не видно, будет создан указатель на одну структуру или динамический массив структур. Это зависит от того, как будет проинициализирован этот указатель. Если, как в предыдущем пункте, выполнить операцию arSd=new tst; то будет создан указатель на одну структуру.

С помощью этой же операции new можно выделить память для динамического массива структур. Это выполняется следующим образом:

int n; cin>>n; // или const n=5;

arSd=new tst[n];

Адрес начала массива структур присваивается переменной указателю arSd. Доступ к полям i– й структуры осуществляется следующим образом:

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

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

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

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

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

}

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