Deklaracje struktur
"Deklaracja struktury" nazywa typ i określa sekwencję wartości zmiennych (nazywanych "elementami członkowskimi" lub "polami" struktury), które mogą być innego typu.Opcjonalny identyfikator, nazywany "tagiem", nadaje nazwę typowi struktury i może być używany w kolejnych odwołaniach do typu struktury.Zmienna tego typu struktury przechowuje całą sekwencję zdefiniowaną przez dany typ.Struktury w języku C są podobne do typów znanych jako "rekordy" w innych językach.
Składnia
struct-or-union-specifier:
identyfikator struct-or-unionopt**{** struct-declaration-list }identyfikator struct-or-union
struct-or-union:
structunion
struct-declaration-list:
struct-declarationstruct-declaration-list struct-declaration
Zawartość struktury jest definiowana jako
struct-declaration:
specifier-qualifier-list struct-declarator-list ;specifier-qualifier-list:
type-specifier specifier-qualifier-list opttype-qualifier specifier-qualifier-list opt
struct-declarator-list:
struct-declaratorstruct-declarator-list , struct-declarator
struct-declarator:
declarator
Deklaracja typu struktury nie ustawia odłożonego miejsca dla struktury.Jest to jedynie szablon dla późniejszych deklaracji zmiennych struktury.
Wcześniej zdefiniowany identyfikator (tag) może być użyty do odwoływania się do typu struktury zdefiniowanego w innym miejscu.W tym przypadku, struct-declaration-list nie może być powtórzony, dopóki widoczna jest definicja.Deklaracje wskaźników do struktur i typedef dla typów struktur mogą używać tagu struktury zanim zostanie zdefiniowany typ struktury.Jednakże, definicja struktury musi zostać napotkana przed jakimkolwiek rzeczywistym wykorzystaniem rozmiaru pól.To jest niekompletna definicja typu i tagu typu.Aby definicja była kompletna, definicja typu musi pojawić się później w tym samym zakresie.
Struct-declaration-list określa typy i nazwy elementów członkowskich struktury.Argument struct-declaration-list zawiera co najmniej jedną zmienną lub deklarację pola bitowego.
Każda zmienna zadeklarowana w struct-declaration-list jest zdefiniowana jako element członkowski typu struktury.Deklaracje zmiennych wewnątrz struct-declaration-list mają taką samą postać jak inne deklaracje zmiennych omówione w tej sekcji, z tym wyjątkiem, że takie deklaracje nie mogą zawierać specyfikatorów klas magazynowania ani inicjatorów.Elementy członkowskie struktury mogą mieć dowolne typy zmiennych, z wyjątkiem typu void, typu niekompletnego lub typu funkcji.
Element członkowski nie może zostać zadeklarowany jako posiadający typ struktury w której występuje.Jednakże, element członkowski może zostać zadeklarowany jako wskaźnik do typu struktury w której występuje, tak długo, jak typ struktury posiada tag.Pozwala to tworzyć połączone listy struktur.
Struktury wykorzystują takie same zakresy jak inne identyfikatory.Identyfikatory struktur muszą się różnić od tagów innych struktur, unii i wyliczeń o tej samej widoczności.
Każda struct-declaration w struct-declaration-list musi być unikatowa w obrębie listy.Jednakże, nazwy identyfikatorów w struct-declaration-list nie muszą różnić się od zwykłych nazw zmiennych lub identyfikatorów na innych listach deklaracji struktury.
Dostęp do struktur zagnieżdżonych może zostać uzyskany, jakby były zadeklarowane na poziomie zakresu pliku.Na przykład, mając deklarację:
struct a
{
int x;
struct b
{
int y;
} var2;
} var1;
obie deklaracje są dopuszczalne:
struct a var3;
struct b var4;
Przykłady
Poniższe przykłady ilustrują deklaracje struktur:
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 członkowski name jest 20-elementową tablicą, a id i class są prostymi elementami członkowskimi, odpowiednio o typach: int i long.Identyfikator employee jest identyfikatorem struktury.
struct employee student, faculty, staff;
W tym przykładzie zdefiniowano trzy zmienne struktury: student, faculty i staff.Każda struktura ma taką samą listę trzech elementów członkowskich.Elementy członkowskie zostały zadeklarowane jako posiadające typ struktury employee, zdefiniowany w poprzednim przykładzie.
struct /* Defines an anonymous struct and a */
{ /* structure variable named complex */
float x, y;
} complex;
Struktura complex posiada dwa elementy członkowskie o typie float: x i y.Typ struktury nie posiada tagu i z tego powodu jest nienazwany lub anonimowy.
struct sample /* Defines a structure named x */
{
char c;
float *pf;
struct sample *next;
} x;
Pierwsze dwa elementy członkowskie struktury są zmiennymi typu char, a wskaźnik pokazuje na wartość typu float.Trzeci element członkowski (next) jest zadeklarowany jako wskaźnik do definiowanego typu struktury (sample).
Struktury anonimowe mogą być użyteczne, gdy nazwany tag nie jest potrzebny.Jest to przypadek, w którym 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 tablice o nieokreślonym rozmiarze lub rozmiarze zerowym jako ostatni element członkowski struktury.Może to być użyteczne, jeśli rozmiar stałej tablicy różni się podczas używania w różnych sytuacjach.Deklaracja takiej struktury wygląda następująco:
struct identyfikator**{** set-of-declarations type array-name**[ ];};**
Tablica o nieokreślonym rozmiarze mogą pojawić się tylko jako ostatni element członkowski struktury.Struktury zawierające deklaracje tablic o nieokreślonym rozmiarze mogą być zagnieżdżone w innych strukturach, tak długo, jak długo żadne dalsze elementy członkowskie nie zostały zadeklarowane w żadnej z otaczających struktur.Tablice takich struktur nie są dozwolone.Operator sizeof zastosowany do zmiennej takiego typu (lub samego typu) przyjmuje jako rozmiar tablicy wartość 0.
Deklaracje struktur mogą również być określone bez deklaratora, gdy są elementami członkowskimi innej struktury lub unii.Nazwy pól są promowane do otaczającej struktury.Na przykład, struktura bez nazwy 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ć informacje dotyczące odwołań do struktur, zobacz Elementy członkowskie struktur i unii.
KONIEC informacji specyficznych dla firmy Microsoft