Тема 6. Структуры и объединения.
Синтаксис структур.
Структуры в языке С аналогичны массиву тесно связанных атрибутов. Однако, в отличие от массива структура позволяет иметь смешанные атрибуты различных типов данных.
Структура создается при помощи ключевого слова 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]);
Дополнительные средства (typedef и enum).
При помощи оператора typedef можно связать новые типы данных с существующими:
typedef double real;
После такого описания можно использовать real вместо double.
Использовать typedef необходимо с осторожностью. Слишком много новых типов могут ухудшить читаемость программы.
Перечисляемый тип данных enum позволяет определить список последовательных данных. Объявление перечисляемого типа выглядит следующим образом:
enum поле_тега {имя1=знач1, имя2=знач2, имя3=знач3, …}переменная;
Здесь имя1, имя2,… – это имена констант. Им можно присваивать целочисленные значения. Если значения не присвоены, то предполагается, что они упорядочены по возрастанию и начинаются с нуля. Под эти константы во время выполнения память не выделяется. Удобно использовать этот оператор для создания констант, если не указывать поле_тега и переменную:
enum (с28=28, с29,с30,c31);
Тип enum часто используется, когда информацию можно представить списком целых значений, подобно номерам дней недели или месяцев в году:
enum months
{Jan=1,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec}
current_month;
current_month=Dec;
int diff=(int)current_month-2;
Поскольку имена эквивалентны последовательным целым значениям, то с ними можно выполнять арифметические операции. Фактически в данном примере переменной current_month присваивается целочисленное значение 12.
Дата добавления: 2018-02-15; просмотров: 839; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!