Структура — это набор элементов, которые могут иметь различные типы.
Структуру можно представить себе как запись, состоящую из нескольких полей или элементов. Структуры обеспечивают удобный способ структурной организации связанных по смыслу переменных.
Агрегатным типом данных называется тип, конструируемый из элементов независимых (возможно различных) типов. Структуры являются одновременно агрегатным и производным типом данных.
Задание шаблонов и объявление структур
Новый тип данных для структуры создается путем описания шаблона структуры.
Шаблон структуры представляет собой список объявлений переменных, описывающий элементы структуры .
struct [имя_шаблона] {список_элементов};
Область действия шаблона структуры определяется также, как и для переменной. Если шаблон объявляется внутри блока, то он известен только в пределах этого блока. Однако, обычно шаблон структуры задается в начале файла или в заголовочном файле. Таким способом шаблон можно сделать доступным всем определенным в файле функциям. Как только шаблон описан, его имя может быть использовано в любом месте файла для объявления соответствующих переменных.
Пример 1
struct emp {
            char name[21];
            char id[8];
            double salary;   /*это шаблон, память не выделяется */
            };
int main ()
{
struct emp prgmr;            /*это объявление: выделяется память под переменную prgmr*/
int num;
...
}
int f(void)
{
struct emp supervisor;       /*это объявление: выделяется память под переменную supervisor*/
...
}
Элементы структуры хранятся в памяти в том порядке, в каком они появляются в списке элементов. При этом в структуру могут быть включены неиспользуемые байты, необходимые для соблюдения требований процессора к выравниванию данных. Так числовые типы данных обычно выравниваются на границу слова. На рис. 1 показана гипотетическая ситуация, так как фактический размер структуры машинно-зависим.
Рис. 1.  Элементы структуры
Ниже рассматриваются альтернативные способы объявления структур.
Одновременное задание имени структуры и объявление структурных переменных
По желанию программиста, переменные типа структуры могут быть объявлены сразу после описания шаблона. Если шаблон и объявление переменной задаются вне функции, то переменная является внешней, в противном случае область ее видимости ограничивается блоком.
Пример 2
struct emp {
            char   name[21];
            char   id[8];
            double salary;
           } prgmr, employee[100], *p;
В прим. 2 объявляется структура prgmr, массив структур employee и указатель на структуру p.
Пропуск имени структуры
Другой способ состоит в том, чтобы опустить имя шаблона структуры. В этом случае все переменные данного типа должны быть перечислены после шаблона.
Пример 3
struct {
        char   name[21];
        char   id[8];
        double salary;
       } prgmr, employee[100], *p;
Использование объявления typedef
Третий способ состоит в том, чтобы использовать оператор typedef. Это избавит программиста от необходимости писать как ключевое слово struct, так и имя структуры при объявлении структурных переменных. Использование оператора typedef для задания однословного имени нового типа может также способствовать повышению удобочитаемости программы.
Пример 4
typedef struct emp {
                    char   name[21];
                    char   id[8];
                    double salary;
                   } EMPLOYEE;
EMPLOYEE prgmr, employee[100], *p;