Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семестр_2_С++.doc
Скачиваний:
4
Добавлен:
23.04.2019
Размер:
217.09 Кб
Скачать

9. Структуры

9.1. Объявление структуры

Структура – структурированный тип данных, объединяющий под одним именем несколько переменных разных типов, которые называются элементами структуры. В качестве полей могут быть переменные простых типов, массивы, другие структуры, указатели и переменные других типов. Структуры облегчают написание и понимание принципов работы программ, а также позволяют сгруппировать данные, объединяемые каким-либо общим понятием. Например, данные: имя, фамилия, год рождения, оценки по экзаменам можно поместить в структуру данных о студенте.

Объявление структуры состоит из двух шагов:

- объявление типа структуры;

- объявление переменной данного типа.

Например, объявим тип структуры

struct Date

{ char Fam[20];

char Name[10];

long TelephoneNumber;

};

где struct – ключевое слово; Date – название нового типа пользователя; Fam, Name, TelephoneNamber – поля структуры.

Объявим переменные S1, S2 типа Date:

Date S1, S2;

Можно объявить структурный тип и переменные структурного типа таким образом:

struct Date

{ char Fam[20];

char Name[10];

long TelephoneNumber;

} S1, S2;

При объявлении переменных типа структуры можно проинициализировать их поля. Например, Date Str={"Иванов","Иван",2034878};

В оперативной памяти переменные S1, S2 будут занимать память по 34 байта каждая.

Доступ к элементам структуры

Доступ к полям структуры осуществляется с помощью оператора "."(точка). При этом сначала записывается имя структурной переменной, а затем через "точку" имя поля структуры. Например,

cin>>S1.Fam;

cout<<S2.Name<<' '<<S2.TelephoneNamber;

S1.TelephoneNamber=2012345;

Переменной структурного типа можно присвоить значение другой переменной того же типа. Например, оператор S1=S2; копирует все поля переменной S2 в S1.

9.2. Вложенные структуры

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

Например,

struct date

{ int day, month, year;

};

struct person

{char fam[20];

date birthday;

float weight;

int height;

};

.....

person P1;

cin>>P1.fam;

cin>>P1.birthday.day;

cin>>P1.birthday.month;

.....

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

9.3. Статические массивы в структурах

Полем структуры может быть одномерный или двумерный массивы фиксированной размерности. Например,

struct Matr

{ int a[2][3];

float b[3];

char fio[20];

};

.....

Matr Str;

Str.a[0][0]=25;

cout<<Str.a[i][j];

cin>>Str.b[2];

Str.fio[0]='*';

.....

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

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

Например,

struct Date

{ char Fam[20];

char Name[10];

long TelephoneNumber;

};

struct date

{ int day, month, year;

};

struct person

{char fam[20];

date birthday;

float weight;

int height;

};

Date list[10];

const n=100;

person P1[n];

Matr matr[n];

.....

cin>>list[1].Fam;

cout<<P1[i]. birthday.day;

matr[0].a[0][1]=25;

.....

9.5. Структуры и указатели

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

Полями структуры могут быть указатели. Например,

struct Str

{ int *x;

int * y;

char * c;

};

....

Str S;

Перед использованием структуры S ее поля-указатели необходимо проинициализировать, например, используя оператор new.

С помощью операции S.x=new int; резервируем память для размещения значения переменной целого типа. Адрес динамической памяти записывается в поле x cтруктуры S. В качестве значения поля x структуры S можно использовать адрес ранее определенной переменной:

int z; S.x=&z;

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

*S.x=5; int g=*S.x;

С помощью оператора S.y=new int [k]; резервируем память для размещения динамического массива из k целых чисел и адрес первого элемента массива записываем в поле y структуры S. После этого с массивом y можно работать.

Например, можно вводить элементы массива:

for(int i=0; i<k; i++) cin>>S.y[i];

С помощью оператора new

S.c=new char[20];

резервируем память для размещения массива из 20 символов и адрес первого байта записываем в поле с структуры S.

Доступ к элементам массивов y и с: S.y[i], S.y[5], S.c[k], S.c[0] и т.д.

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

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

Date * p1;

person *p2;

Str *p3;

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

a) адрес структуры определить с помощью new

Date * uk=new Date;

b) указателю на структуру присвоить адрес ранее объявленной структуры:

Date str;

Date * uk=&str;

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

const n=5;

Date str[n];

Date * uk=str;

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

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

1.Вместо операции "." (точка) используется операция "->" (стрелка). Например,

struct Date

{ char Fam[20];

char Name[10];

long TelephoneNumber;

};

Date * uk=new Date;

uk-> TelephoneNumber=2034870;

cin>>uk->Fam;

2.Разыменование указателя и формирование уточненного имени по правилу:

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

Например, *(uk). TelephoneNumber=2034870; Операция разыменования должна относиться к имени указателя, а не к уточненному имени поля структуры.