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

2.4. Ссылка на структуру.

Для структур, как и для простых переменных, можно использовать ссылочный тип. Например, tst &SS1=S1; При этом ссылка на структуру должна быть проинициализирована другой ранее объявленной переменной такого же структурного типа, но не указателем.

По аналогии с простыми переменными после такого объявления SS1 и S1 — это два альтернативных имена (синонимы) одной и той же переменной структурного типа. Поэтому если мы изменим какое-нибудь поле в структуре S1, то этим самым изменится и это же поле в структуре SS1. Например, если выполнить

S1.per=20; cout<<(SS1.per);

то выведем число 20, несмотря на то, что SS1.per мы явно, казалось бы, не меняли.

2.5. Указатели и вложенные структуры

Пусть объявлена структура для хранения декартовых координат одной точки на плоскости:

struct TMyP { float x, y;};

Вторая структура использует её:

struct tst2

{ TMyP p1;

unsigned m;

TMyP *p2;

TMyP *dar;

float per;

} S1, *PS, *D;

1) Доступ к полям структуры S1 выполняется так: S1.per, S1.p1.x, S1.p1.y. Перед использованием указателей их надо проинициализировать. Пусть p2 — адрес одной структуры. Тогда S1.p2=new TMyP; Заметим, что в new записываем тип, указанный при объявлении p2. Тогда доступ к простым полям, не указателям, записывается так: S1.p2–>x , S1.p2–>y. При этом первой используется точка, так как S1 — не указатель, а “стрелку” записали, так как p2 — указатель.

Динамический массив в структуре S1 создаём так:

cin >>S1.m; // Вводим размерностьмассива, например, количество точек

S1. dar=new TMyP[S1.m]; //Создаём динамический массив

// Ввод координат точек

for (int j=0; j<S1.m; j++)

{ cin>>S1.dar[j].x;

cin>>S1.dar[j].y;

}

2) Пусть PS — указатель на одну структуру. Поэтому сначала выполняем

PS= new tst2;

Тогда доступ к простым полям, не указателям, выполняется так:

PS–>per, PS–>p1.x, PS–>p1.y.

Здесь наоборот, первой используется “стрелка” , так как PS —указатель, а “точку” записали, так как p1 — не указатель. Пусть p2 — по-прежнему адрес одной структуры:

PS–>p2=new TMyP;

Тогда доступ к полям записывается так:

PS–>p2–>x , PS–>p2–>y.

При этом дважды используется “стрелка”, так как и PS, и p2 — указатели.

Динамический массив в структуре PS создаём в такой последовательности. Сначала вводим размерностьмассива, например, количество точек

cin >> PS–>m;

Затем резервируем память для массива

PS–>ard=new TMyP[PS–>m];

Ввод координат точек

for (int j=0; j< PS–>m; j++)

{ cin>> PS–>dar[j].x;

cin>> PS–>dar[j].y;

}

Заметим, что для доступа к координатам используется точка, так как dar[j] — это не указатель, а j – я структура. Указателем является имя массива dar, а не его элемент.

3) Пусть, наконец, Dдинамический массив структур. Тогда сначала определяем его размерность:

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

Затем резервируем память для этого массива:

D=new tst2[n];

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

D[i]. per, D[i]. p1.x, D[i]. p1.y.

Здесь дважды используется “точка”, так как и D[i], и p1 — не указатели.

Пусть p2 — по-прежнему адрес одной структуры. Тогда

D[i].p2=new TMyP;

резервирует память для структуры p2, принадлежащей i-й структуре типа tst2. Доступ к координатам в этом случае такой:

D[i].p2–>x , S1.p2–>y.

При этом первой используется точка, так как D[i] — не указатель, а “стрелку” записали, так как p2 — указатель.

Динамический массив в структуре D[i] создаём так. Вводим размерностьмассива для i-й структуры, например, количество точек i-го многоугольника:

cin >> D[i] .m;

Затем создаём динамический массив

D[i]. dar=new TMyP[D[i].m];

и вводим координаты точек

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

{ cin>> D[i].dar[j].x;

cin>> D[i].dar[j].y;

}

Здесь дважды используется “точка”, так как и D[i], и dar[j] — не указатели, а элементы динамических массивов. Указателями являются имена этих массивов, D и dar соответственно. Понятно, что для работы со всеми структурами массива D нужен, как минимум, ещё один цикл по i.