Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Антонюк и др.doc
Скачиваний:
45
Добавлен:
07.11.2018
Размер:
32.99 Mб
Скачать
    1. Структуры и объединения. Синтаксис структур.

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

Структура создается при помощи ключевого слова struct, за которым следует поле тега (имя структуры) и список элементов. Описание структуры заканчивается точкой с запятой, т.к. оно является оператором:

struct поле_тега

{

тип_элемента1 имя_элемента1;

тип_элемента2 имя_элемента2;

тип_элемента3 имя_элемента3;

};

Пример описания структуры:

struct stboat

{

char type[16]; // тип

char model[16]; // модель

char title[20]; // имя

int year; // год выпуска

double price; // цена

};

Эта структура описывает новый тип данных stboat и содержит три текстовых поля, одно целое и одно действительное.

С описанной структурой не связывается никакая переменная. Для создания новой переменной используется оператор (слово struct является необязательным):

struct имя_структуры имя-переменной;

Для вышеприведенного примера можно создать переменную used_boat:

struct sboat used_boat;

Если со структурой связывается только одна переменная, то ее можно объявить непосредственно в описании структуры перед точкой с запятой. Поле тега в этом случае можно опустить:

struct

{

char type[16]; // тип

char model[16]; // модель

char title[20]; // имя

int year; // год выпуска

double price; // цена

} used_boat;

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

Для обращения к отдельным элементам структуры используется операция обращения к члену структуры – “точка”. Она разделяет имя структурной переменной и имя поля, например

used_boat.year=1955;

printf(“%lf”,used_boat_price);

Элементы структуры обрабатываются также, как и любые другие переменные С, необходимо только использовать операцию «точка».

Можно создавать массивы структур и указатели на структуру, для обращения к элементам структуры предусмотрен оператор “->” (стрелка, он состоит из знаков минус и больше).

sboat boat_array[10];

boat_array[3].year=1980;

sboat *pboat;

pboat=&used_boat;

pboat->price=12570.25;

Передача структур в функции.

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

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

Можно также использовать указатели на структуру.

Структуры и битовые поля.

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

struct поле_тега

{

тип_элемента1

имя_поля1:колич_бит1,

имя_поля2:колич_бит2,

имя_поля3:колич_бит3,

…;

тип_элемента2

};

В таких структурах можно использовать только целочисленные типы:

struct keybits

{

unsigned char

shift :1,

ctrl :1,

scrool:1,

lock :1;

};

Объединения.

Объединения – еще один тип данных, которые можно использовать различным образом. К примеру, некоторые данные в одном случае могут рассматриваться как целые, а в другом – как числа с плавающей точкой. По виду объединения напоминают структуры. Объединение тоже содержит несколько типов данных, однако, эти данные занимают одну и ту же область памяти.

Объединение создается при помощи ключевого слова union:

union поле_тега

{

тип_элемента1 имя_элемента1;

тип_элемента2 имя_элемента2;

тип_элемента3 имя_элемента3;

};

К членам объединения можно обращаться так же, как и к членам структур, либо через операцию «точка», либо через операцию «->» – для указателей:

union many_types

(

char c[4];

int ivalue[2];

float fvalue;

} type1;

type1.fvalue=1.5;

printf(“%i %i”,type1.ivalue[0],type1.ivalue[1]);