Anmerkung
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen, dich anzumelden oder die Verzeichnisse zu wechseln.
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen , die Verzeichnisse zu wechseln.
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