Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика 1.docx
Скачиваний:
11
Добавлен:
26.09.2019
Размер:
364.88 Кб
Скачать

Описание структур и объединений в виде пользовательского типа.

Специфика использования структур, объединений и перечислений как отдельного типа данных предполагает постоянное использование ключевых слов struct, union, enum каждый раз когда в программе описывается новая переменная. Этого можно избежать, если описать эти типы данных в виде пользовательского типа данных. Пользовательский тип данных – это тип данных, определяемый пользователем с помощью ключевого слова typedef:

typedef StandardTypeID UserTypeID;

Ключевое слово typedef определяет новый пользовательский тип UserTypeID и ставит ему в соответствие известный тип UserTypeID.

В качестве идентификатора пользовательского типа UserTypeID можно указать любой незапрещённый идентификатор, а в качестве StandardTypeID должен быть указан стандартный тип языка C (основной или производный) или ранее описанный пользовательский тип.

Например, после описания:

typedef char* CharPointer;

в программе можно использовать тип CharPointer, который по сути является типом "указатель на char".

Как уже было сказано, в качестве StantardTypeID может использоваться любой производный тип. Поэтому в рамках языка C можно использовать следующую запись:

typedef struct

{

int x;

int y;

}MyStruct;

Такой участок кода опишет новый тип MyStruct, которому соответствует структура с 2 полями x и y. Заметьте, что здесь идентификатор MyStruct является не частью описания структуры (см. синтаксис выше), а вторым параметром оператора typedef.

При использовании такой формы записи для описания структур мы описываем новый пользовательский тип MyStruct, поэтому необходимость в использовании ключевого слова struct при создании новых переменных с таким типом отпадает. При объявлении переменной можно просто записывать MyStruct MyVar;

Сравним эту форму записи с первоначальной формой определения структур, описанной выше:

  1. Первоначальная (оригинальная) форма определения структуры:

struct MyStruct

{

int x;

int y;

};

struct MyStruct MyVar;

  1. Форма записи с использованем typedef

typedef struct

{

int x;

int y;

}MyStruct;

MyStruct MyVar;

Поскольку при использовании второй формы записи работа со структурами становится ещё больше похожей на работу с основными типами (т.к. не надо писать дополнительные ключевые слова), то чаще всего пользуются именно этой формой. В языке C++ устарела и эта форма записи – в нём идентификатор структуры сам является типом, поэтому его можно использовать как пользовательский тип при объявлении переменных без использования "struct" (а следовательно надобность в typedef отпадает).

Всё вышесказанное применимо также и для объединений (union) и перечислений (enum).

Передача структур и объединений в виде параметров функции.

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

Рассмотрим оба варианта на примере следующей программы, печатающей значения элементов структуры:

#include "stdio.h"

typedef struct

{

int x;

int y;

}MyStruct;

void PrintByVal(MyStruct st)

{

printf("x=%d\n",st.x);

printf("y=%d\n",st.y);

}

void PrintByRef(MyStruct * st)

{

printf("x=%d\n",st->x);

printf("y=%d\n",st->y);

}

void main()

{

MyStruct MySt;

MySt.x=1;

MySt.y=2;

PrintByVal(st); // Передаём структуру по значению

PrintByRef(&st); // Передаём структуру по указателю

}

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

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

MyStruct Func(int i)

{

MyStruct st;

st.x=0;

st.y=i;

return st;

}

Если же использовать оригинальную форму записи структур, то это будет выглядеть так:

struct MySt

{

int x;

int y;

};

struct MySt Func(int i)

{

struct MySt st;

st.x=0;

st.y=i;

return st;

}