Объединения

Объединениями называют сложный тип данных, позволяющий размещать в одном и том же месте оперативной памяти данные различных типов.

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

Общая форма объявления объединения:

union ИмяОбъединения {

тип Имя0бъекта1;

тип Имя0бъекта2;

тип ИмяОбъектап;

};

Объединения применяют:

  • • для инициализации объекта, если в каждый момент времени только один из многих объектов является активным;
  • • для интерпретации представления одного типа данных в виде другого типа.

Пример программы, которая меняет 2 байта местами во введенном числе.

union

{

unsigned char р[2];

unsigned int t;

} type;

int main()

{

char temp;

printf("Enter number: ");

scant ("%d", &type.t);

printf("%d = %x hex. ",type.t, type.t);

// Замена байтов

temp = type.p[0];

type.p[0] = type.p[l];

type.p[l] = temp;

printf("Bytes are changed. ");

printf("%d = %x hex ",type.t, type.t);

return 0;

}

Массивы структур

Работа с массивами структур аналогична работе со статическими массивами других типов данных.

Пример программы, использующей массив структур.

struct book

{

char title [15];

char author [15];

int value;

};

int main()

{

struct book libry[3];

int i;

// считываем данные с клавиатуры

for (i=0;i<3;i++)

{

printf ("Enter title of %d book:",i+l);

gets(libryfi].title);

printf ("Enter author of %d book: ",i+l);

gets (libry[i] .author);

printf ("Enter value of %d book: ”,i+l);

scanf("%d",&libry[i].value);

getchar();

}

// выводим результат на экран

for(i=0;i<3;i++)

{

printf(" %d. %s ", i+1,libry[і].author);

printf("%s

%d",libry[i].title,libry[i].value);

}

return 0;

}

Указатели на структуры и динамическая память

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

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

выражение идентификатор

(^выражение), идентификатор,

где выражение - указатель на структуру или объединение;

идентификатор - поле структуры или объединения;

Динамически выделять память под массив структур необходимо в том случае, если заранее неизвестен размер массива. Для определения размера структуры в байтах используется операция sizeof (имя структуры).

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

struct book

{char title [15];

char author [15];

int value;

};

int main()

{ struct book *lib;

int i;

lib = malloc (3*sizeof(struct book));

for(i=0;i<3;i++)

{

printf("Enter title of %d book:",i+1);

gets((lib+i)— title);

printf("Enter author of %d book: ”,i+l);

gets ( (lib+i)-> author);

printf("Enter value of %d book: ",i+l);

scanf("%d",&(lib+i)— value);

getchar();

}

for (i=0;i<3;i++)

{ printf(" %d. %s ", i+l, (lib+i)-> author); printf("%s%d", (lib+i)-» title, (lib+i)value);

}

free(lib);

return 0;

Результат выполнения аналогичен предыдущему примеру.

Использование typedef

Синтаксис языка С предусматривает использование спецификатора typedef для определения новых имен типов данных (тегов). Спецификатор typedef можно использовать как со стандартными типами данных, так и со структурами, объединениями и перечислениями.

Для объявления нового типа, формат которого будет совпадать с типом int, можно использовать конструкцию:

typedef int Mylnt;

Теперь можно использовать переменные типа Mylnt:

Mylnt і = 0;

printf("Mylnt=%d", і);

Аналогично спецификатор typedef можно использовать со структурами.

struct MyStruct

{

int і;

float v;

};

typedef struct MyStruct MyStruct;

void main()

{

MyStruct m;

m.і = 10;

m.v = 0.3;

}

Более того, объявление струкутры MyStruct и создание тега MyStruct можно объединить.

typedef struct MyStruct

{

int і;

float v;

} MyStruct;

В результате далее можно не писать слово struct при использовании созданной структуры.

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ   След >