Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
En "strukturdeklaration" namnger en typ och anger en sekvens med variabelvärden (kallas "medlemmar" eller "fält" i strukturen) som kan ha olika typer. En valfri identifierare, kallad "tagg", ger namnet på strukturtypen och kan användas i efterföljande referenser till strukturtypen. En variabel av den strukturtypen innehåller hela sekvensen som definierats av den typen. Strukturer i C liknar de typer som kallas "poster" på andra språk.
Syntax
struct-or-union-specifier:
struct-or-union
identifier
välja{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
välja
type-qualifier
specifier-qualifier-list
välja
struct-declarator-list:
struct-declarator
struct-declarator-list
,
struct-declarator
struct-declarator:
declarator
type-specifier
declarator
välja:constant-expression
Deklarationen av en strukturtyp reserverar inte utrymme för en struktur. Det är bara en mall för senare deklarationer av strukturvariabler.
En tidigare definierad identifier (tagg) kan användas för att referera till en strukturtyp som definierats någon annanstans. I det här fallet struct-declaration-list kan inte upprepas så länge definitionen är synlig. Deklarationer av pekare till strukturer och typedefs för strukturtyper kan använda strukturtaggen innan strukturtypen definieras. Strukturdefinitionen måste dock påträffas innan fältens storlek faktiskt används. Den här användningen är en ofullständig definition av typen och typtaggen. För att den här definitionen ska kunna slutföras måste en typdefinition visas senare i samma omfång.
struct-declaration-list Anger typerna och namnen på strukturmedlemmarna. Ett struct-declaration-list argument innehåller en eller flera deklarationer för variabel eller bitfält.
Varje variabel som deklareras i struct-declaration-list definieras som medlem i strukturtypen. Variabeldeklarationer i struct-declaration-list har samma formulär som andra variabeldeklarationer som beskrivs i det här avsnittet, förutom att deklarationerna inte kan innehålla storage-class-specificerare eller initialiserare. Strukturmedlemmarna kan ha alla variabeltyper förutom typ void, en ofullständig typ eller en funktionstyp.
En medlem kan inte deklareras ha den typ av struktur som den visas i. En medlem kan dock deklareras som en pekare till den strukturtyp där den visas så länge strukturtypen har en tagg. Det gör att du kan skapa länkade listor med strukturer.
Strukturerna följer samma omfång som andra identifierare. Strukturidentifierare måste skilja sig från andra struktur-, union- och uppräkningstaggar med samma synlighet.
Var och struct-declaration en i en struct-declaration-list måste vara unik i listan. Identifierarnamn i en struct-declaration-list behöver dock inte skilja sig från vanliga variabelnamn eller från identifierare i andra strukturdeklarationslistor.
Kapslade strukturer kan också nås som om de deklarerades på filomfångsnivå. Med den här deklarationen kan du till exempel:
struct a
{
int x;
struct b
{
int y;
} var2;
} var1;
dessa deklarationer är båda lagliga:
struct a var3;
struct b var4;
Exempel
De här exemplen illustrerar strukturdeklarationer:
struct employee /* Defines a structure variable named temp */
{
char name[20];
int id;
long class;
} temp;
Strukturen employee har tre medlemmar: name, idoch class. Medlemmen name är en matris med 20 element och idclass är enkla medlemmar med int respektive long typ. Identifieraren employee är strukturidentifieraren.
struct employee student, faculty, staff;
I det här exemplet definieras tre strukturvariabler: student, facultyoch staff. Varje struktur har samma lista över tre medlemmar. Medlemmarna deklareras ha strukturtypen employee, definierad i föregående exempel.
struct /* Defines an anonymous struct and a */
{ /* structure variable named complex */
float x, y;
} complex;
Strukturen complex har två medlemmar med float typen x och y. Strukturtypen har ingen tagg och är därför namnlös eller anonym.
struct sample /* Defines a structure named x */
{
char c;
float *pf;
struct sample *next;
} x;
De två första medlemmarna i strukturen är en char variabel och en pekare till ett float värde. Den tredje medlemmen, next, deklareras som en pekare till den strukturtyp som definieras (sample).
Anonyma strukturer kan vara användbara när taggnamnet inte behövs, till exempel när en deklaration definierar alla strukturinstanser. Till exempel:
struct
{
int x;
int y;
} mystruct;
Inbäddade strukturer är ofta anonyma.
struct somestruct
{
struct /* Anonymous structure */
{
int x, y;
} point;
int type;
} w;
Microsoft-specifik
Kompilatorn tillåter en matris med oformaterad eller nollstorlek som den sista medlemmen i en struktur. Det är användbart om storleken på en konstant matris skiljer sig åt när den används i olika situationer. Deklarationen av en sådan struktur ser ut så här:
struct
identifier
{
set-of-declarations
type
array-name
[]; };
Ej anpassade matriser kan bara visas som den sista medlemmen i en struktur. Strukturer som innehåller icke-anpassade matrisdeklarationer kan kapslas i andra strukturer så länge inga ytterligare medlemmar deklareras i någon omslutande struktur. Matriser med sådana strukturer tillåts inte. Operatorn sizeof , när den tillämpas på en variabel av den här typen eller på själva typen, förutsätter 0 för matrisens storlek.
Strukturdeklarationer kan också anges utan deklarator när de är medlemmar i en annan struktur eller union. Fältnamnen befordras till den omslutande strukturen. En namnlös struktur ser till exempel ut så här:
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 */
Mer information om strukturreferenser finns i Struktur- och unionsmedlemmar.
Avsluta Microsoft Specifik