Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_по_пяву_4.doc
Скачиваний:
101
Добавлен:
15.03.2015
Размер:
1.29 Mб
Скачать
  1. Структуры

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

  • элементами,

  • полями,

  • членами.

От уже рассмотренных выше массивов структура отличается в следующих отношениях:

  • отсутствует упорядоченность между компонентами,

  • в отличие от массивов компоненты структуры могут иметь разный тип.

  • другой способ обращения к компонентам; к компонентам структуры следует обращаться по имени их полей (а не индексу как это имеет место в случае массивов).

Обратим внимание на неоднозначность термина структура. В языке Си под этим термином наряду со структурой как типом данных понимают переменную, имеющую тип структуры.

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

Общий формат, позволяющий наряду с типом объявлять и переменные, имеет следующий вид:

struct[<>] {

<> }[γ];

Здесь:

  • struct– ключевое слово языка Си,

  • α - необязательный элемент, называемый тегом,

  •  - список объявлений полей,

  • γ - список переменных, имеющих тип объявляемой структуры.

Элементы объявления α и γ могут отсутствовать. Список γ подчиняется синтаксису обычных переменных. Переменные, включенные в этот список, могут использоваться только в составе структурной переменной. Определение такого формата выполняют две функции:

    • объявляют структуру как тип данных.

    • определяет переменные, имеющие этот тип.

Рассмотрим ряд примеров.

Пример 1. Совместное определение типа и переменных

#define MLEN 81

struct person_salary

{

char fio[MLEN];

double salary;

} employee, worker;

Тегом определяющей здесь структуры является здесь идентификатор person_salary. Структура имеет два поля. Первым полем является строкаfio, предназначенная для хранения фамилии, имени и отчества. Второе поле имеет типdoubleи предназначено для хранения сведений о заработке. Здесь же определены две переменные, имеющие структурный тип:

  • employee (служащий),

  • worker (рабочий).

Здесь необходимо следует иметь в виду следующее. В программе, написанной на языке C++, тег является именем типа. В языке Си в качестве имени типа следует использовать конструкциюstruct<α (тег)> .

Пример 2. Раздельное определение типа и переменных

#define MLEN 81

struct person_salary

{

char fio[MLEN];

double salary;

};

//…

struct person_salary employee, worker;

Пример 3. Компонент тег можно опускать

#defineMLEN81

struct

{

char fio[MLEN];

double salary;

} employee, worker;

В этом примере определен так называемый анонимный тип. У этого типа нет тега. Поэтому на него нельзя ссылаться в другом программном коде. Польза от этого кода в определенных здесь двух переменных employeeиworker.

Пример 4. Определение типа, переменной и указателя на структуру.

#define MLEN 81

struct person_salary

{

char fio[MLEN];

double salary;

};

//…

struct person_salary employee;

struct person_salary* p = &employee;

Здесь дополнительно объявлен и инициализирован указатель на структуру типа struct_salary.

    1. Обращение к полям структуры

Для обращения к отдельным полям структуры в языке Си служат два оператора:

  • .

  • ->

Оператор . используется в том случае, когда известна переменная, имеющая тип структуры. Оператор -> при работе со структурой через указатель. Оба оператора относится к категории бинарных операторов. Эти операторы имеют следующий формат:

  • <α1> . <>.

  • <α2> -> <>.

Здесь α1 – переменная, имеющая тип структуры, α2 – указатель, установленный на объект типа структуры, а - поле структуры.

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

#define MLEN 81

struct person_salary

{

char fio[MLEN];

double salary;

};

//…

struct person_salary employee;

struct person_salary* p = &employee;

Тогда можно написать следующий программный код, содержащий обращения к полям объекта employee.

strcpy(employee.fio, “Petrov Ivan Ivanovich”);

puts(p->fio);

p->salary = 10000;

printf(“%10.3f\n”, employee.salary);