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

1.3. Вложенные структуры и статические массивы в структурах

В качестве поля структуры можно использовать переменную другого ранее определённого структурного типа. В таком случае говорят о вложенных структурах. Например, сначала определим структуру для координат одной точки плоскости:

struct tpoint2 { float x; float y; };

В другой структуре определим координаты центра и радиус окружности:

struct tcircle { tpoint2 senter; float rad;

} MyCircle;

Тогда для ввода координат центра окружности надо выполнить следующий оператор:

cin >> MyCircle.senter.x>> MyCircle.senter.y;

То есть доступ к полям вложенной структуры осуществляется с помощью нескольких операций “точка”.

Полем структуры может быть одномерный или двумерный массивы фиксированной размерности. Пример объявления и доступ к такому полю показан в структуре tstr1(см. 1.1).

1.4. Статический массив структур

Для объявления массива структур желательно сначала определить структурный тип, а затем объявляем массив переменных данного типа. Например, массив из 10 точек структуры типа tpoint2(см. 1.3) объявляем следующим образом:

const n=10; tpoint2 ArrPoints[n];

Такой массив в памяти занимает (4+4)*n= 80 байт. Доступ к полям каждого элемента массива, например, ввод координат точек, осуществляется так:

for (int k=0; k<10; k++)

cin>>ArrPoints [k].x>> ArrPoints [k].y;

Для массива, объявленного

const n=10; tstr1 AS[n];,

доступ к его элементам и полям осуществляется, например, следующим образом:

  1. AS[i].Par=1.2; — полю Par i-го элемента массива структур присваивается значение 1.2 (i=0,1,…,n-1);

  2. int Sum=0; for (int j=0; j<12; j++) Sum+=AS[0].arr[j]; — суммирование всех 12-ти элементов массива arr (поля структуры) 0-го элемента массива структур AS

§2. Cтруктуры и указатели

2.1. Указатели в структуре.

Пусть объявлена следующая структура:

struct tst { char *t;

int m;

float *ard;

float per;

int *p;

} S1;

Перед использованием полей-указателей их надо инициализировать. Один из способов сделать это — использование операции new. С помощью операции S1.t=new char[20]; резервируем память для размещения строки из 20 символов, и адрес её первого байта размещаем в поле структуры t. Для размерности строки можно использовать не только константу, а и переменную, которую необходимо предварительно определить, например, ввести:

unsigned l; cin>>l; S1.t=new char[l];

После этого строку можно вводить (gets(S1.t);) или определить её с помощью функци: strcpy(S1.t, “The first testing”); Доступ к символам строки выполняется с помощью индексов: S1.t[j], где j может принимать значения от 0 до length(S1.t).

Пусть ard— адрес динамического одномерного массива размерности m, включённой в качестве поля структуры. Сначала определяем эту размерность, например, вводим её: cin>>S1.m;, а затем резервируем память для массива: S1.ard=new float [S1.m]; Доступ к элементам такого массива осуществляется также, как и к элементам статического массива. Например, для ввода записываем: for (int j=0; j<S1.m; j++) cin>>S1.ard[j];

В структуре может быть переменная-указатель, в которой хранится адрес переменной простого типа (int *p;). Тогда перед использованием такой переменной необходимо определить значение этого адреса. Это можно сделать одним из следующих способов:

a) с помощью операции new: S1.p=new int;

b) можно использовать адрес ранее определённой переменной:

int b; S1.p=&b;

c) полю можно присвоить ранее определённый адрес:

int *q=new int; S1.p=q;

d) переменную–указатель можно инициализировать с помощью статического массива, имя которого является адресом его начала: int a[10]; S1.p=a;

Доступ к содержимому ячейки, адрес которой находится в S1.p, осуществляется с помощью операции разыменование, например, *(S1.p)=3; или можно без скобок: *S1.p=3; Здесь операция “*” относится к полю структуры, т.е. к переменной p, а не к S1. Но для элементов массива (вариант d) такая операция не нужна: S1.p[j]=5;