Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Объявление структуры присваивает типу и задает последовательность значений переменных (называемых "члены" или "поля" структуры), которые могут иметь разные типы. Необязательный идентификатор, называемый тегом, присваивает имя типа структуры и может использоваться в последующих ссылках на тип структуры. Переменная этого типа структуры содержит всю последовательность, определенную этим типом. Структуры в C похожи на типы, известные как "записи" на других языках.
Синтаксис
struct-or-union-specifier:
struct-or-union
identifier
выбирать{struct-declaration-list}
struct-or-union
identifier
struct-or-union:
struct
union
struct-declaration-list:
struct-declaration
struct-declaration-list
struct-declaration
struct-declaration:
specifier-qualifier-list
struct-declarator-list
;
specifier-qualifier-list:
type-specifier
specifier-qualifier-list
выбирать
type-qualifier
specifier-qualifier-list
выбирать
struct-declarator-list:
struct-declarator
struct-declarator-list
,
struct-declarator
struct-declarator:
declarator
type-specifier
declarator
выбирать:constant-expression
Объявление типа структуры не выделяет пространство для структуры. Это только шаблон для последующих объявлений переменных структуры.
Ранее определенный identifier (тег) можно использовать для ссылки на тип структуры, определенный в другом месте. В этом случае нельзя повторять до тех пор, struct-declaration-list пока определение отображается. Объявления указателей на структуры и типдефы для типов структур могут использовать тег структуры перед определением типа структуры. Однако определение структуры должно быть обнаружено до фактического использования размера полей. Это неполное определение типа и тега типа. Чтобы это определение было завершено, определение типа должно отображаться позже в той же области.
Указывает struct-declaration-list типы и имена элементов структуры. Аргумент struct-declaration-list содержит одно или несколько объявлений переменной или битового поля.
Каждая переменная, объявленная в struct-declaration-list , определяется как член типа структуры. Объявления переменных в пределах struct-declaration-list формы имеют ту же форму, что и другие объявления переменных, рассмотренные в этом разделе, за исключением того, что объявления не могут содержать описатели класса хранилища или инициализаторы. Элементы структуры могут иметь любые типы переменных, кроме типа void, неполный тип или тип функции.
Элемент не может быть объявлен типом структуры, в которой она отображается. Однако элемент можно объявить как указатель на тип структуры, в котором он отображается до тех пор, пока тип структуры имеет тег. Он позволяет создавать связанные списки структур.
Структуры следуют той же области, что и другие идентификаторы. Идентификаторы структуры должны отличаться от других тегов структуры, объединения и перечисления с той же видимостью.
Каждая struct-declaration из них struct-declaration-list должна быть уникальной в списке. Однако имена идентификаторов в struct-declaration-list ней не должны отличаться от обычных имен переменных или идентификаторов в других списках объявлений структуры.
К вложенным структурам также можно получить доступ, как если бы они были объявлены на уровне области файла. Например, учитывая это объявление:
struct a
{
int x;
struct b
{
int y;
} var2;
} var1;
Эти объявления являются юридическими:
struct a var3;
struct b var4;
Примеры
В этих примерах иллюстрируются объявления структуры:
struct employee /* Defines a structure variable named temp */
{
char name[20];
int id;
long class;
} temp;
Структура employee состоит из трех элементов: name, idи class. Элемент name представляет собой массив 20 элементов и idclass является простыми элементами и intlong типом соответственно. Идентификатор — это идентификатор employee структуры.
struct employee student, faculty, staff;
В этом примере определяются три переменные структуры: student, facultyи staff. Каждая структура имеет один и тот же список трех членов. Элементы объявляются как тип employeeструктуры, определенный в предыдущем примере.
struct /* Defines an anonymous struct and a */
{ /* structure variable named complex */
float x, y;
} complex;
Структура complex содержит два члена с типом floatx и y. Тип структуры не имеет тега и поэтому не именован или анонимный.
struct sample /* Defines a structure named x */
{
char c;
float *pf;
struct sample *next;
} x;
Первые два члена структуры — это char переменная и указатель на float значение. Третий член nextобъявляется в качестве указателя на определяемый тип структуры (sample).
Анонимные структуры могут быть полезны, если имя тега не требуется, например, когда одно объявление определяет все экземпляры структуры. Рассмотрим пример.
struct
{
int x;
int y;
} mystruct;
Внедренные структуры часто анонимны.
struct somestruct
{
struct /* Anonymous structure */
{
int x, y;
} point;
int type;
} w;
Специфично для Microsoft
Компилятор разрешает неструктурированный или нулевой размер массива в качестве последнего элемента структуры. Полезно, если размер константного массива отличается при использовании в различных ситуациях. Объявление такой структуры выглядит следующим образом:
struct
identifier
{
set-of-declarations
type
array-name
[]; };
Неструктурированные массивы могут отображаться только в качестве последнего элемента структуры. Структуры, содержащие неструктурированные объявления массива, могут быть вложены в другие структуры, пока никакие дополнительные элементы не объявляются в любых вложенных структурах. Массивы таких структур не допускаются. Оператор sizeof , при применении к переменной этого типа или к самому типу, предполагает 0 для размера массива.
Объявления структуры также можно указать без декларатора, когда они являются членами другой структуры или объединения. Имена полей продвигаются в заключиющую структуру. Например, безымяная структура выглядит следующим образом:
struct s
{
float y;
struct
{
int a, b, c;
};
char str[10];
} *p_s;
.
.
.
p_s->b = 100; /* A reference to a field in the s structure */
Дополнительные сведения о ссылках на структуры см. в разделе "Структуры" и "Члены союза".
Конец раздела, относящегося к Microsoft