Тема 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!