- •7. Указатели, массивы
- •7.1. Понятие адреса
- •7.2. Указатели
- •7.3. Арифметические операции и операции сравнения
- •7.4. Указатели и одномерные массивы
- •7.5. Возвращение функцией нескольких значений
- •7.6. Указатели на указатели
- •7.7. Массивы указателей и двумерные массивы
- •7.8. Массивы динамической памяти Одномерные динамические массивы
- •Двумерные динамические массивы
- •8. Строки
- •9. Структуры
- •9.1. Объявление структуры
- •9.2. Вложенные структуры
- •9.3. Статические массивы в структурах
- •9.4. Статический массив структур
- •9.5. Структуры и указатели
- •9.6. Динамический массив структур
- •9.7.Ссылка на структуру
- •9.8. Структуры и функции
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; Операция разыменования должна относиться к имени указателя, а не к уточненному имени поля структуры.