Что такое структурный тип в с

Сложные типы данных в Си

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

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

Общая форма объявления структуры:

После закрывающей фигурной скобки > в объявлении структуры обязательно ставится точка с запятой.

Пример объявления структуры

В указанном примере структура date занимает в памяти 12 байт. Кроме того, указатель *month при инициализации будет началом текстовой строки с названием месяца, размещенной в памяти.

При объявлении структур, их разрешается вкладывать одну в другую.

Инициализация полей структуры

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

В первом способе инициализация осуществляется по следующей форме:

Имя элемента структуры является составным. Для обращения к элементу структуры нужно указать имя структуры и имя самого элемента. Они разделяются точкой:

Второй способ инициализации объектов языка Си с использованием функций ввода-вывода.

Объединения

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

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

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

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

Что такое структурный тип в с. Смотреть фото Что такое структурный тип в с. Смотреть картинку Что такое структурный тип в с. Картинка про Что такое структурный тип в с. Фото Что такое структурный тип в с

Объединения применяются для следующих целей:

Например, удобно использовать объединения, когда необходимо вещественное число типа float представить в виде совокупности байтов

Результат выполнения:
Что такое структурный тип в с. Смотреть фото Что такое структурный тип в с. Смотреть картинку Что такое структурный тип в с. Картинка про Что такое структурный тип в с. Фото Что такое структурный тип в с

Пример Поменять местами два младших байта во введенном числе

Результат выполнения
Что такое структурный тип в с. Смотреть фото Что такое структурный тип в с. Смотреть картинку Что такое структурный тип в с. Картинка про Что такое структурный тип в с. Фото Что такое структурный тип в с

Битовые поля

Используя структуры, можно упаковать целочисленные компоненты еще более плотно, чем это было сделано с использованием массива.

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


При работе с битовыми полями нужно внимательно следить за тем, чтобы значение переменной не потребовало памяти больше, чем под неё выделено.

Пример Разработать программу, осуществляющую упаковку даты в формат
Что такое структурный тип в с. Смотреть фото Что такое структурный тип в с. Смотреть картинку Что такое структурный тип в с. Картинка про Что такое структурный тип в с. Фото Что такое структурный тип в с

Результат выполнения
Что такое структурный тип в с. Смотреть фото Что такое структурный тип в с. Смотреть картинку Что такое структурный тип в с. Картинка про Что такое структурный тип в с. Фото Что такое структурный тип в с

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

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

Пример Библиотека из 3 книг

Результат выполнения
Что такое структурный тип в с. Смотреть фото Что такое структурный тип в с. Смотреть картинку Что такое структурный тип в с. Картинка про Что такое структурный тип в с. Фото Что такое структурный тип в с

Указатели на структуры

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

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

указатель — указатель на структуру или объединение;
поле — поле структуры или объединения;

Динамическое выделение памяти для структур

Пример Библиотека из 3 книг

Комментариев к записи: 37

struct date
<
int day; // 4 байта
char *month; // 4 байта
int year; // 4 байта
>;

# if ndef department_h
#define department_h

#include
struct Office
<
char title[50];

struct <
int amount; // количество сотрудников
char lastname[50]; // фамилия начальника
> inc;

struct <
int year;
int month;
> date;

#include //подключаем основную библиотеку
#include
#include //подключаем библиотеку математики
#include //подключаем библиотеку языков
#include
#include «department.h»
#define N 0

int small( struct Office* a, int n, int year, int month)
<
int i = 0, index = 0, min = 0;
while ((a[i].date.year > year) || (a[i].date.month > month) && (a[i].date.year == year)) //сравниваем дату создания с датой, введенной нами
<
i++;
>

index = i;
min = a[i].inc.amount;

for (i; i //находим самый маленький отдел и сравниваем дату с другими датами создания отдела
<
if ((a[i].inc.amount return index;
>

int main()
<
setlocale(LC_ALL, «Rus» ); //включение локализации
setlocale(LC_NUMERIC, «Eng» ); //использование «.» в дробных значениях

int n = 0, year = 0, month = 0;

n = sizeof (A) / sizeof (A[0]); //размер (в байтах) всего массива, то есть сумма всех элементов/ размер (в байтах) одной структуры (50)

for ( int i = 0; i # else
struct Office A[19];
create(A, &n);

for ( int i = 0; i #endif

Источник

Структурный тип.

Дата добавления: 2013-12-23 ; просмотров: 2205 ; Нарушение авторских прав

• название товара (char*);

• оптовая (закупочная) цена (long);

• торговая наценка в процентах (float);

• объем партии товара (int);

• дата поступления партии товара (char[9]).

В перечислении элементов структуры «товары на складе» добавлены выбранные программистом типы этих элементов. В соответствии со смыслом компоненты могут иметь любой из типов данных, допустимых в языке. Так как товаров на складе может быть много, для определения отдельных структур, содержащих сведения о конкретных товарах, программист вводит производный тип, называемый структурным. Для нашего примера его можно ввести, например, так:

Что такое структурный тип в с. Смотреть фото Что такое структурный тип в с. Смотреть картинку Что такое структурный тип в с. Картинка про Что такое структурный тип в с. Фото Что такое структурный тип в с

structимя_структурного_типа

где struct— спецификатор структурного типа;

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

Конструкция structимя_структурного_типа играет ту же роль, что и спецификаторы типов, например, doubleили int.С помощью structgoods можно либо определить конкретную структуру (как, например, объект структурного типа structgoods), либо указатель на структуры такого типа. Пример:

Что такое структурный тип в с. Смотреть фото Что такое структурный тип в с. Смотреть картинку Что такое структурный тип в с. Картинка про Что такое структурный тип в с. Фото Что такое структурный тип в с

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

Еще одну возможность ввести структурный тип дает служебное слово typedef,позволяющее ввести собственное обозначение для любого определения типа. В случае структурного типа он может быть введен и поименован следующим образом:

typedef struct

Что такое структурный тип в с. Смотреть фото Что такое структурный тип в с. Смотреть картинку Что такое структурный тип в с. Картинка про Что такое структурный тип в с. Фото Что такое структурный тип в с

Приведенное определение вводит структурный тип struct<doublereal; doubleimag;> и присваивает ему обозначение (название, имя) complex. С помощью этого обозначения можно вводить структуры (объекты) так же, как с обычным именем структурного типа (например, structgoods в предыдущем примере). Пример:

Что такое структурный тип в с. Смотреть фото Что такое структурный тип в с. Смотреть картинку Что такое структурный тип в с. Картинка про Что такое структурный тип в с. Фото Что такое структурный тип в с

Что такое структурный тип в с. Смотреть фото Что такое структурный тип в с. Смотреть картинку Что такое структурный тип в с. Картинка про Что такое структурный тип в с. Фото Что такое структурный тип в с.

С помощью директивы #defineможно вводить имена типов подобно тому, как это делается с помощью typedef.Например, сведения о книге могут быть введены таким образом:

Что такое структурный тип в с. Смотреть фото Что такое структурный тип в с. Смотреть картинку Что такое структурный тип в с. Картинка про Что такое структурный тип в с. Фото Что такое структурный тип в с

Что такое структурный тип в с. Смотреть фото Что такое структурный тип в с. Смотреть картинку Что такое структурный тип в с. Картинка про Что такое структурный тип в с. Фото Что такое структурный тип в с

После препроцессорных замен и исключения комментариев это предложение примет вид (с точностью до размещения по строкам):

Что такое структурный тип в с. Смотреть фото Что такое структурный тип в с. Смотреть картинку Что такое структурный тип в с. Картинка про Что такое структурный тип в с. Фото Что такое структурный тип в с

(Смотрите ниже определение структур и определение указателей на структуры.)

Источник

Тема: Структурные типы и структуры

(4 часа)

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

Структуры

Структуры конструируются следующим образом:

struct имя_структурного_типа<

>; // символ «точка с запятой (;)» обязателен!

unsigned int price;

Здесь struct – спецификатор структурного типа (служебное слово); film – имя структурного типа (определяется пользователем); в фигурных скобках размещаются описания элементов, которые будут входить в каждый объект типа film.

имя_структурного_типа – идентификатор, произвольно выбираемый программистом;

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

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

Описание указателя на структуры такого типа выглядит следующим образом:

struct film *pointer;

Допускается определение структур одновременно с определением структурного типа:

Переменные s1, s2 определяются как структуры, каждая из которых состоит из двух компонент х и у. Переменная sm определяется как массив из девяти структур. Каждая из двух переменных date1, date2 состоит из трех компонентов year, moth, day.

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

typedef struct<определения_элементов>

Использование идентификаторов структуры необходимо для описания рекурсивных структур. Ниже рассматривается использование рекурсивных идентификаторов структуры.

Идентификатор структуры node действительно является рекурсивным, так как он используется в своем собственном описании, т.е. в формализации указателя next. Структуры не могут быть прямо рекурсивными, т.е. структура node не может содержать компоненту, являющуюся структурой node, но любая структура может иметь компоненту, являющуюся указателем на свой тип, как и сделано в приведенном примере.

Доступ к компонентам структуры осуществляется с помощью указания имени структуры и следующего через точку имени выделенного компонента, например, для структуры film:

x.price=100000; Конструкция имя_структуры.имя_элемента называется уточненным именем.Если переменная x определена как указатель на структуру, то для доступа к полям структуры следует использовать операцию “->”. Оператор x->name эквивалентен выражению (*x).name.Инициализацию структуры можно выполнить непосредственно в определении конкретной структуры после ее имени и знака «=» в фигурных скобках:struct film f1=<“Фильм1”, “режиссер1”, “Страна1”, 222222>;Стандарт языка С допускает присваивание структур: x=film1;Для структур не определены операции сравнения, допускается сравнение по элементам.Выделение памяти для структурОпределение структурного типа не связано с выделением памяти, а при определении объекта структурного типа ему выделяется память в таком количестве, чтобы могли разместиться данные всех элементов. Реальный размер памяти в байтах, выделяемый для структуры, можно определить с помощью операцииsizeof(имя_структуры)sizeof(имя_структурного_типа)

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

Определяются массивы структур так же, как и массивы других типов данных. Единственное отличие – служебное слово struct в названии структурного типа (если обозначение структурного типа не введено с помощью typedef), например:

struct film a[100];

Указатели на структуры

Указатели на структуры определяются, как и указатели на другие типы данных: struct film *ptr;

Указатели могут вводиться и для безымянных структурных типов:

Источник

C++: Теоретические сведения: Структуры и объединения, перечисления

Теоретические сведения
Структуры и объединения, перечисления

Структуры и объединения – это один из примеров составных типов данных, называемых агрегатными типами, или просто агрегатами. Структурные переменные, или просто структуры, – это объединение одной или более переменных, возможно, разных типов, в одну область памяти, имеющую одно имя. Отдельные составные части структурной переменной называются полями.
Объединения подобны структурам в том, что содержат поля различных типов, но помещаемые в одно и то же место памяти. Фактически объединения – это доступ к одному и тому же месту памяти, но по-разному.
Перечисления (enumeration) также задают особый тип данных, предназначенный для создания идентификаторов для целых констант.

Описание структур
Т.

Теоретические сведения
Структуры и объединения, перечисления

Структуры и объединения – это один из примеров составных типов данных, называемых агрегатными типами, или просто агрегатами. Структурные переменные, или просто структуры, – это объединение одной или более переменных, возможно, разных типов, в одну область памяти, имеющую одно имя. Отдельные составные части структурной переменной называются полями.
Объединения подобны структурам в том, что содержат поля различных типов, но помещаемые в одно и то же место памяти. Фактически объединения – это доступ к одному и тому же месту памяти, но по-разному.
Перечисления (enumeration) также задают особый тип данных, предназначенный для создания идентификаторов для целых констант.

Описание структур
Термин «структура» в языке программирования Си соответствует двум разных по смыслу понятиям:
1) обозначение места в памяти, где располагается информация; далее это место называется структурной переменной;
2) правила формирования структурной переменной, используемые компилятором для выделения ей места в памяти и организации доступа к ее полям; далее такие правила называются шаблоном (pattern) структуры или структурной переменной.
Как и любая переменная, структурная переменная должна описываться. Это описание состоит из двух шагов:
1) задание шаблона структуры;
2) собственно описание структурной переменной. Каждый шаблон имеет собственное имя для того, чтобы компилятор мог различать различные шаблоны. В том случае, если в функции используется единственный шаблон, он может не иметь имя, что задается пропуском имени при описании шаблона. Имена шаблонов должны быть уникальными в пределах их области определения, и в частности в пределах одной функции может быть только один безымянный шаблон. Синтаксис задания шаблона таков:
где имя_шаблона – имя шаблона, удовлетворяющее правилам задания идентификаторов языка Си;
тип_1, тип_2. тип_N – любые типы, например int, char, float;
имя_поля_1, имя_поля_2. имя_поля_N – имена полей, удовлетворяющие правилам задания идентификаторов языка Си. Например:
Имена полей в одном шаблоне должны быть уникальными. Однако в разных шаблонах можно использовать совпадающие имена полей. Кроме того, имена шаблонов проверяются на уникальность друг с другом, а не с метками или именами переменных. Раз так, то имя шаблона может и совпадать с именами полей, переменных или метками.
Задание шаблона не связано с резервированием какой-либо памяти компилятором. Шаблон дает компилятору всю необходимую информацию о полях структурной переменной для резервирования места в памяти и организации доступа к этой памяти при описании структурной переменной и ссылках на отдельные поля структурной переменной. Фактически шаблон – это задание нового типа struct имя_шаблона. В приведенном примере был введен новый тип struct BOOK.
Как и простая переменная, шаблон имеет область определения (видимость). Если шаблон описан внутри блока <>, – это локальный шаблон, видимый только из пределов данного блока, в частности из пределов конкретной функции. Если описание шаблона помещено вне блоков, такой шаблон видим во всех функциях ниже точки описания шаблона до границы файла. Нельзя описать шаблон с реквизитом extern.
Когда задан шаблон, может быть описана структурная переменная. Описание структурной переменной состоит из задания типа и имени структурной переменной. Например: Здесь описывается структурная переменная по приведенному ранее шаблону BOOK. Компилятор выделит под переменную число байтов памяти, достаточное для хранения всех ее полей. В данном случае это 70 байт. Число байтов, выделенное под структурную переменную, не всегда равно сумме длин отдельных полей из-за влияния дополнительного фактора внутреннего представления структурных переменных, называемого выравниванием. Точно выделенное число байтов всегда возвращает операция sizeof (struct имя_шаблона). Например, sizeof (struct BOOK) возвратит всегда 70, однако для других шаблонов возможны варианты.
Синтаксис языка программирования Си разрешает совмещать описание шаблона и структурной переменной, например так:
Для структурных переменных действуют правила видимости и времени жизни.
Для доступа к отдельным полям структурной переменной используют операцию ‘.’, формируя ссылку на нужное поле посредством имени структурной переменной и имени нужного поля. Такая ссылка может располагаться в любом месте выражений, где допустимы ссылки на простые переменные. Например, если сделано ранее рассмотренное описание структурных переменных, корректными будут следующие выражения:

реклама

Вложение структур
Поле структурной переменной может иметь любой тип, в том числе и быть другой структурой. Поле, являющееся структурой, называют вложенной структурой. Естественно, что шаблон вкладываемой структуры должен быть уже известен компилятору. Например:

В данном примере описывается шаблон структуры, имеющей вложенную структуру, и три структурные переменных по шаблону BOOK, т. е. и для вложенных структур действуют те же правила описания полей: задается шаблон (в данном примере это struct UDC) и имя поля (в шаблоне BOOK это udk_dass).
Ссылка на поле вложенной структуры формируется из имени структурной переменной, имени структурного поля и имени поля вложенной структуры. Перечисленные имена разделяются символом ‘.’ операции точка. Например, если сделано описание структурных переменных по приведенному ранее шаблону BOOK с вложенной структурой UDK, будут корректны следующие выражения:
Единственное ограничение на вложение структур состоит в том, что структура не может вкладываться сама в себя, т. е. некорректным, например, будет следующее выражение:
Отметим, что разрешается использовать описываемый шаблон, если одно из полей является указателем на описываемую структуру. Например, будет корректным такое описание:

реклама

Передача структур функции
Как и для обычных переменных, С поддерживает как вызов функции с передачей копии всей структурной переменной или только отдельных ее полей (Call-By-Value), так и с передачей указателя на всю или только отдельные поля структурной переменной (Call-By-Reference). Функция может возвращать как структурную переменную, так и указатель на нее.
Вызов функции с передачей всей структурной переменной связан с дополнительными потерями времени на запись ее копии в стек. Зато при этом все манипуляции с копией не влияют на исходную переменную. По той же причине возврат функцией целой структурной переменной требует затрат на размещение в стеке возвращаемого значения.
Другая часто используемая возможность для передачи и (или) возврата структурных переменных – использование внешних структурных переменных, видимых как в точке вызова, так и в вызываемой функции.

Битовые поля в структурах
Язык Си допускает использование в структурах особого типа полей – так называемых битовых полей. Их использование делает возможным доступ к отдельным битам более крупных объектов, например байтов или слов. Общий синтаксис описания битового поля:
тип [имя ]: ширина;
где скобками [] выделены необязательные элементы.
Содержимое битового поля может описываться как имеющее знак (signed), так и как беззнаковое (unsigned). Два этих ключевых слова записываются в поле тип. Каждому полю выделяется точно столько бит, сколько задается в поле ширина. Ссылка на битовое поле выполняется по имени, указываемому в поле имя. Если имя в этом поле опущено, запрошенные биты все равно выделяются, но доступ к ним невозможен. Например:

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

Перечисления
Тип данных «перечисление» (enumeration) используется для облегчения создания мнемонических идентификаторов для набора целых значений.
Общий синтаксис для задания переменной-перечисления подобен синтаксису описания структурной переменной: сначала задается новый тип, а затем описывается переменная. где имя_шаблона – необязательное имя конструируемого типа;
имя_1, имя_2. – символические имена перечисляемых констант;
константа_1, константа_2. – необязательные значения, задающие значения перечисляемым константам (скобками [] выделены необязательные элементы).
Как и для имен шаблонов структур, можно задать шаблон перечисления и без имени, но такой «безымянный» шаблон должен быть единственным в пределах видимости (блок, файл).
При описании переменной-перечисления задается имя нового типа, а затем – имя переменной. Например: Здесь описываются две переменные-перечисления week_day и anyday по шаблону, имя которого days. Используя директиву typedef, можно сократить время на описание новых переменных. Например: Переменной-перечислению могут присваиваться только значения, задаваемые перечисляемыми константами. Значения перечисляемым константам задаются либо явной инициализацией, либо в случае ее отсутствия – по умолчанию. В случае отсутствия явных инициализаторов первой перечисляемой константе ставится в соответствие значение 0, а каждая следующая перечисляемая константа принимается на единицу большей, чем предыдущая. Таким образом, в приведенном выше примере перечисления DAYS символическая константа monday будет равна 1, a sunday – 7.
Число байтов, выделяемых под переменную-перечисление, зависит от значения перечисляемых констант. Если все значения могут быть представлены данными типа unsigned char, то под переменную выделяется один байт. В частности, описанные ранее week_day и anyday будут занимать в памяти 1 байт. В противном случае используются 2 байта, а значения переменной-перечисления имеют тип int.
Имя переменной-перечисления может использоваться всюду в выражениях и описаниях типов. Но присваивать такой переменной можно только значения перечисляемых констант. Например:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *