Teilen über


Strukturdeklarationen

Eine "Strukturdeklaration" benennt einen Typ und gibt eine Abfolge von Variablenwerten (als "Member" oder "Felder" der Struktur bezeichnet) an, die unterschiedliche Typen aufweisen können. Ein optionaler Bezeichner, der als "Tag" bezeichnet wird, gibt den Namen des Strukturtyps an und kann in nachfolgenden Verweisen auf den Strukturtyp verwendet werden. Eine Variable dieses Strukturtyps enthält die gesamte durch diesen Typ definierte Sequenz. Strukturen in C ähneln den Typen, die in anderen Sprachen als "Datensätze" bezeichnet werden.

Syntax

struct-or-union-specifier:
struct-or-union identifier optieren{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 optieren
type-qualifier specifier-qualifier-list optieren

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

struct-declarator:
declarator
type-specifier declarator optieren:constant-expression

Die Deklaration eines Strukturtyps legt keinen Platz für eine Struktur fest. Es ist nur eine Vorlage für spätere Deklarationen von Strukturvariablen.

Ein zuvor definierter identifier (Tag) kann verwendet werden, um auf einen an anderer Stelle definierten Strukturtyp zu verweisen. In diesem Fall kann nicht wiederholt werden, struct-declaration-list solange die Definition sichtbar ist. Deklarationen von Zeigern auf Strukturen und Typedefs für Strukturtypen können das Strukturtag verwenden, bevor der Strukturtyp definiert wird. Die Strukturdefinition muss jedoch vor jeder tatsächlichen Verwendung der Größe der Felder ermittelt werden. Diese Verwendung ist eine unvollständige Definition des Typs und des Typtags. Damit diese Definition abgeschlossen werden kann, muss eine Typdefinition später im selben Bereich angezeigt werden.

Dies struct-declaration-list gibt die Typen und Namen der Strukturmber an. Ein struct-declaration-list Argument enthält eine oder mehrere Variablen- oder Bitfelddeklarationen.

Jede deklarierte struct-declaration-list Variable wird als Element des Strukturtyps definiert. Variablendeklarationen in struct-declaration-list derselben Form wie andere in diesem Abschnitt erläuterte Variablendeklarationen, mit der Ausnahme, dass die Deklarationen keine Speicherklassenbezeichner oder Initialisierer enthalten können. Die Strukturmember können über beliebige Variablentypen mit Ausnahme des Typs void, eines unvollständigen Typs oder eines Funktionstyps verfügen.

Ein Element kann nicht deklariert werden, damit er den Typ der Struktur aufweist, in der es angezeigt wird. Ein Element kann jedoch als Zeiger auf den Strukturtyp deklariert werden, in dem es angezeigt wird, solange der Strukturtyp über ein Tag verfügt. Damit können Sie verknüpfte Listen mit Strukturen erstellen.

Strukturen folgen dem gleichen Bereich wie andere Bezeichner. Strukturbezeichner müssen sich von anderen Struktur-, Union- und Enumerationstags mit der gleichen Sichtbarkeit unterscheiden.

Jeder struct-declaration in einer struct-declaration-list muss innerhalb der Liste eindeutig sein. Bezeichnernamen in einer struct-declaration-list Datei müssen sich jedoch nicht von gewöhnlichen Variablennamen oder Bezeichnern in anderen Strukturdeklarationslisten unterscheiden.

Auf geschachtelte Strukturen kann auch zugegriffen werden, als ob sie auf Dateiebene deklariert wurden. Beispiel:

struct a
{
    int x;
    struct b
    {
      int y;
    } var2;
} var1;

Diese Erklärungen sind beide legal:

struct a var3;
struct b var4;

Beispiele

Diese Beispiele veranschaulichen Strukturdeklarationen:

struct employee   /* Defines a structure variable named temp */
{
    char name[20];
    int id;
    long class;
} temp;

Die employee Struktur besteht aus drei Elementen: name, id, und class. Das name Element ist ein 20-Elementarray und idclass sind einfache Elemente mit int bzw long . Typ. Der Bezeichner ist der Strukturbezeichner employee .

struct employee student, faculty, staff;

In diesem Beispiel werden drei Strukturvariablen definiert: student, faculty, und staff. Jede Struktur weist dieselbe Liste von drei Elementen auf. Die Member werden deklariert, um den Strukturtyp employeezu haben, der im vorherigen Beispiel definiert ist.

struct           /* Defines an anonymous struct and a */
{                /* structure variable named complex  */
    float x, y;
} complex;

Die complex Struktur verfügt über zwei Elemente mit float Typ x und y. Der Strukturtyp hat kein Tag und ist daher nicht benannt oder anonym.

struct sample   /* Defines a structure named x */
{
    char c;
    float *pf;
    struct sample *next;
} x;

Die ersten beiden Elemente der Struktur sind eine char Variable und ein Zeiger auf einen float Wert. Das dritte Element , wird als Zeiger auf den Strukturtyp deklariert, nextder definiert wird (sample).

Anonyme Strukturen können nützlich sein, wenn der Tagname nicht benötigt wird, z. B. wenn eine Deklaration alle Strukturinstanzen definiert. Beispiel:

struct
{
    int x;
    int y;
} mystruct;

Eingebettete Strukturen sind häufig anonym.

struct somestruct
{
    struct    /* Anonymous structure */
    {
        int x, y;
    } point;
    int type;
} w;

Microsoft Specific

Der Compiler ermöglicht ein unsized- oder zero-size-Array als letztes Element einer Struktur. Es ist nützlich, wenn sich die Größe eines Konstantenarrays unterscheidet, wenn es in verschiedenen Situationen verwendet wird. Die Deklaration einer solchen Struktur sieht wie folgt aus:

struct identifier { set-of-declarations type array-name []; };

Nicht strukturierte Arrays können nur als letztes Element einer Struktur angezeigt werden. Strukturen, die unsisierte Arraydeklarationen enthalten, können in anderen Strukturen geschachtelt werden, solange keine weiteren Member in eingeschlossenen Strukturen deklariert werden. Arrays solcher Strukturen sind nicht zulässig. Der sizeof Operator, wenn er auf eine Variable dieses Typs oder auf den Typ selbst angewendet wird, geht von 0 für die Größe des Arrays aus.

Strukturdeklarationen können auch ohne Deklarator angegeben werden, wenn sie Mitglieder einer anderen Struktur oder Vereinigung sind. Die Feldnamen werden in die eingeschlossene Struktur heraufgestuft. Beispielsweise sieht eine namenslose Struktur wie folgt aus:

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 */

Weitere Informationen zu Strukturverweisen finden Sie unter Struktur- und Union-Mitglieder.

Ende Microsoft-spezifisch

Siehe auch

Deklaratoren und Variablendeklarationen