Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
53
Добавлен:
11.05.2015
Размер:
547.84 Кб
Скачать

Структуры и функции

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

struct COMPLEX f1(int n);

struct complex * f2(int n);

void f3(struct complex cmpl);

void f4(struct complex *Pcmpl);

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

Объединения

Еще одним агрегирующим типом данных в языке С являются объединения, которые вводятся при помощи служебного слова union.

Объединение – это переменная, которая может содержать (в разное время) объекты различных типов и размеров.

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

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

Для обращения к элементу объединения используются те же конструкции, что и для обращения к элементу структуры:

<имя объединения>.<имя элемента>

(*<указатель на объединение>).<имя элемента >

< указатель на объединение > -> < имя элемента >

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

Определение объединений осуществляется точно так же, как и структур

typedef union REG {

unsigned char Byte[2];

unsigned short Word;

} REGISTR;

REG – имя объединяющего типа;

REGISTR – обозначение объединяющего типа;

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

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

Если для хранения типа текущего значения u использовать переменную utype, то

if (utype == INT)

printf(“%d\n”, u.ival);

else if(utype == FLOAT)

printf(“%f\n”, u.fval);

else if(utype == STRING)

printf(“%s\n”, u.sval);

else

printf(“неверный тип %d в utype\n”, utype);

Инициализировать объединение можно только значением, имеющим тип его первого члена. Упомянутую выше переменную u можно инициализировать только значением типа int.