Объявления структур
"Объявление структуры" именует тип и задает последовательность переменных значений ("элементы" или "поля" структуры), которые могут иметь разные типы. Необязательный идентификатор — тег — предоставляет имя типа структуры и может использоваться в последующих ссылках на тип структуры. Переменная этого типа структуры включает определенную этим типом последовательность целиком. Структуры в языке 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
пока определение отображается. Объявления указателей на структуры и объекты typedef для типов структуры могут использовать тег структуры до определения типа структуры. Однако определение структуры необходимо получить до выполнения каких-либо фактических действий с размером полей. Это неполное определение типа и тега типа. Для того чтобы это определение стало полным, определение типа должно отображаться позже в той же области.
Указывает 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-элементный массив, а id
и class
— простые элементы с типом int
и long
соответственно. Идентификатор 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
содержит два элемента с типом float
— x
и 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;
Блок, относящийся только к системам Майкрософт
Компилятор позволяет использовать безразмерный массив или массив нулевого размера в качестве последнего члена структуры. Полезно, если размер константного массива отличается при использовании в различных ситуациях. Объявление такой структуры выглядит следующим образом.
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 */
Дополнительные сведения о ссылках на структуры см. в разделе "Структуры" и "Члены союза".
Завершение блока, относящегося только к системам Майкрософт