Udostępnij za pośrednictwem


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-unionidentifierZdecydować { 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-specifierspecifier-qualifier-listZdecydować
type-qualifierspecifier-qualifier-listZdecydować

struct-declarator-list:
struct-declarator struct-declarator-list , struct-declarator

struct-declarator:
declarator
type-specifierdeclaratorZdecydować : 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, idi 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, facultyi staff. Każda struktura ma tę samą listę trzech elementów członkowskich. Składowe mają typ employeestruktury 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

Zobacz też

Deklaratory i deklaracje zmiennych