Deklaracje struktur
"Deklaracja struktury" nazywa typ i określa sekwencję wartości zmiennych (nazywanych "elementami członkowskimi" lub "polami" struktury), które mogą mieć różne typy. Opcjonalny identyfikator, nazywany "tagiem", nadaje nazwę typu struktury i może być używany w kolejnych odwołaniach do typu struktury. Zmienna tego typu struktury zawiera całą sekwencję zdefiniowaną przez ten typ. Struktury w języku C są podobne do typów znanych jako "rekordy" w innych językach.
Składnia
struct-or-union-specifier
:
struct-or-union
identifier
Zdecydować {
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
Zdecydować
type-qualifier
specifier-qualifier-list
Zdecydować
struct-declarator-list
:
struct-declarator
struct-declarator-list
,
struct-declarator
struct-declarator
:
declarator
type-specifier
declarator
Zdecydować :
constant-expression
Deklaracja typu struktury nie odkłada miejsca na strukturę. Jest to tylko szablon dla późniejszych deklaracji zmiennych struktury.
Wcześniej zdefiniowany identifier
(tag) może służyć do odwoływania się do typu struktury zdefiniowanego gdzie indziej. W takim przypadku nie można powtórzyć, struct-declaration-list
o ile definicja jest widoczna. Deklaracje wskaźników do struktur i definicji typów struktury mogą używać tagu struktury przed zdefiniowaniem typu struktury. Należy jednak napotkać definicję struktury przed rzeczywistym użyciem rozmiaru pól. Jest to niekompletna definicja typu i tag typu. Aby ta definicja została ukończona, definicja typu musi pojawić się w dalszej części tego samego zakresu.
Określa struct-declaration-list
typy i nazwy składowych struktury. struct-declaration-list
Argument zawiera co najmniej jedną zmienną lub deklarację pola bitowego.
Każda zmienna zadeklarowana w elemencie struct-declaration-list
jest definiowana jako element członkowski typu struktury. Deklaracje zmiennych w ramach programu struct-declaration-list
mają taką samą formę jak inne deklaracje zmiennych omówione w tej sekcji, z tą różnicą, że deklaracje nie mogą zawierać specyfikatorów ani inicjatorów klasy magazynu. Składowe struktury mogą mieć dowolne typy zmiennych, z wyjątkiem typu void
, niekompletnego typu lub typu funkcji.
Nie można zadeklarować elementu członkowskiego, aby mieć typ struktury, w której się pojawia. Można jednak zadeklarować element członkowski jako wskaźnik do typu struktury, w którym jest wyświetlany tak długo, jak typ struktury ma tag. Umożliwia tworzenie połączonych list struktur.
Struktury są zgodne z tym samym zakresem co inne identyfikatory. Identyfikatory struktury muszą być różne od innych tagów struktury, unii i wyliczenia z taką samą widocznością.
Każda struct-declaration
z struct-declaration-list
nich musi być unikatowa na liście. Jednak nazwy identyfikatorów w obiekcie struct-declaration-list
nie muszą być różne od zwykłych nazw zmiennych ani identyfikatorów na innych listach deklaracji struktury.
Dostęp do zagnieżdżonych struktur można również uzyskać tak, jakby zostały zadeklarowane na poziomie zakresu plików. Na przykład, biorąc pod uwagę tę deklarację:
struct a
{
int x;
struct b
{
int y;
} var2;
} var1;
obie deklaracje są legalne:
struct a var3;
struct b var4;
Przykłady
Te przykłady ilustrują deklaracje struktury:
struct employee /* Defines a structure variable named temp */
{
char name[20];
int id;
long class;
} temp;
Struktura employee
ma trzy elementy członkowskie: name
, id
i class
. Element name
członkowski jest tablicą 20-elementową i id
class
są prostymi elementami członkowskimi odpowiednio i int
long
typem. Identyfikator jest identyfikatorem employee
struktury.
struct employee student, faculty, staff;
W tym przykładzie zdefiniowano trzy zmienne struktury: student
, faculty
i staff
. Każda struktura ma tę samą listę trzech elementów członkowskich. Składowe mają typ employee
struktury zdefiniowany w poprzednim przykładzie.
struct /* Defines an anonymous struct and a */
{ /* structure variable named complex */
float x, y;
} complex;
Struktura complex
ma dwa elementy członkowskie z typem x
float
i y
. Typ struktury nie ma tagu i dlatego nie jest nazwany ani anonimowy.
struct sample /* Defines a structure named x */
{
char c;
float *pf;
struct sample *next;
} x;
Pierwsze dwa elementy członkowskie struktury są zmienną char
i wskaźnikiem float
do wartości. Trzeci element członkowski next
, jest zadeklarowany jako wskaźnik do zdefiniowanego typu struktury (sample
).
Struktury anonimowe mogą być przydatne, gdy nazwa tagu nie jest potrzebna, na przykład gdy jedna deklaracja definiuje wszystkie wystąpienia struktury. Na przykład:
struct
{
int x;
int y;
} mystruct;
Struktury osadzone są często anonimowe.
struct somestruct
{
struct /* Anonymous structure */
{
int x, y;
} point;
int type;
} w;
Specyficzne dla firmy Microsoft
Kompilator zezwala na tablicę o rozmiarze niezwymiarowym lub zerowym jako ostatni element członkowski struktury. Jest to przydatne, jeśli rozmiar tablicy stałej różni się w przypadku użycia w różnych sytuacjach. Deklaracja takiej struktury wygląda następująco:
struct
identifier
{
set-of-declarations
type
array-name
[]; };
Tablice niezwymiarowe mogą być wyświetlane tylko jako ostatni element członkowski struktury. Struktury zawierające deklaracje tablicy niezdysyfikowanej mogą być zagnieżdżone w innych strukturach, o ile nie są deklarowane żadne dalsze elementy członkowskie w strukturach otaczających. Tablice takich struktur nie są dozwolone. Operator sizeof
, po zastosowaniu do zmiennej tego typu lub samego typu, przyjmuje wartość 0 dla rozmiaru tablicy.
Deklaracje struktury można również określić bez deklaratora, gdy są członkami innej struktury lub unii. Nazwy pól są promowane do otaczającej struktury. Na przykład struktura bez nazw wygląda następująco:
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 */
Aby uzyskać więcej informacji na temat odwołań do struktury, zobacz Struktura i składowe unii.
END Microsoft Specific