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

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

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.


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



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