Dichiarazioni di strutturaStructure Declarations

Una "dichiarazione di struttura" denomina un tipo e specifica una sequenza di valori variabili (denominati "membri" o " campi" della struttura) con tipi differenti.A "structure declaration" names a type and specifies a sequence of variable values (called "members" or "fields" of the structure) that can have different types. Un identificatore facoltativo, denominato "tag," fornisce il nome del tipo di struttura e può essere utilizzato nei riferimenti successivi a tale tipo.An optional identifier, called a "tag," gives the name of the structure type and can be used in subsequent references to the structure type. Una variabile del tipo di struttura contiene l'intera sequenza definita dal tipo specificato.A variable of that structure type holds the entire sequence defined by that type. Le strutture in C sono simili ai tipi noti come "record" in altri linguaggi.Structures in C are similar to the types known as "records" in other languages.

SintassiSyntax

struct-or-union-specifier:struct-or-union-specifier:
struct-or-union identifier opt{ struct-declaration-list }struct-or-union identifier opt{ struct-declaration-list }

struct-or-union identifierstruct-or-union identifier

struct-or-union:struct-or-union:
structstruct

unionunion

struct-declaration-list:struct-declaration-list:
struct-declarationstruct-declaration

struct-declaration-list struct-declarationstruct-declaration-list struct-declaration

Il contenuto della struttura viene definito comeThe structure content is defined to be

struct-declaration:struct-declaration:
specifier-qualifier-list struct-declarator-list ;specifier-qualifier-list struct-declarator-list ;

specifier-qualifier-list:specifier-qualifier-list:
type-specifier specifier-qualifier-list opttype-specifier specifier-qualifier-list opt

type-qualifier specifier-qualifier-list opttype-qualifier specifier-qualifier-list opt

struct-declarator-list:struct-declarator-list:
struct-declaratorstruct-declarator

struct-declarator-list , struct-declaratorstruct-declarator-list , struct-declarator

struct-declarator:struct-declarator:
declarator

La dichiarazione di un tipo di struttura non riserva spazio per una struttura.The declaration of a structure type does not set aside space for a structure. È solo un modello per le dichiarazioni delle variabili di struttura successive.It is only a template for later declarations of structure variables.

È possibile usare un identifier (tag) definito in precedenza per fare riferimento a un tipo di struttura definito altrove.A previously defined identifier (tag) can be used to refer to a structure type defined elsewhere. In questo caso, non è possibile ripetere struct-declaration-list se la definizione è visibile.In this case, struct-declaration-list cannot be repeated as long as the definition is visible. Le dichiarazioni di puntatori a strutture e a typedef per i tipi di strutture possono utilizzare il tag della struttura prima che il tipo di struttura venga definito.Declarations of pointers to structures and typedefs for structure types can use the structure tag before the structure type is defined. Tuttavia, la definizione della struttura deve essere rilevata prima di qualsiasi effettivo utilizzo della dimensione dei campi.However, the structure definition must be encountered prior to any actual use of the size of the fields. Si tratta di una definizione incompleta del tipo e del tag del tipo.This is an incomplete definition of the type and the type tag. Affinché questa definizione venga completata, è necessario che una definizione di tipo sia presente più avanti nello stesso ambito.For this definition to be completed, a type definition must appear later in the same scope.

struct-declaration-list specifica i tipi e i nomi dei membri della struttura.The struct-declaration-list specifies the types and names of the structure members. Un argomento struct-declaration-list contiene una o più dichiarazioni di variabile o campo di bit.A struct-declaration-list argument contains one or more variable or bit-field declarations.

Ogni variabile dichiarata in struct-declaration-list è definita come un membro del tipo di struttura.Each variable declared in struct-declaration-list is defined as a member of the structure type. Le dichiarazioni delle variabili in struct-declaration-list hanno lo stesso formato di altre dichiarazioni delle variabili illustrate in questa sezione, ad eccezione del fatto che le dichiarazioni non possono contenere gli identificatori o gli inizializzatori di una classe di archiviazione.Variable declarations within struct-declaration-list have the same form as other variable declarations discussed in this section, except that the declarations cannot contain storage-class specifiers or initializers. I membri della struttura possono avere qualsiasi tipo di variabile tranne il tipo void, un tipo incompleto o un tipo di funzione.The structure members can have any variable types except type void, an incomplete type, or a function type.

Un membro non può essere dichiarato con lo stesso tipo della struttura in cui è presente.A member cannot be declared to have the type of the structure in which it appears. Tuttavia, un membro può essere dichiarato come puntatore al tipo di struttura in cui è presente purché il tipo di struttura disponga di un tag.However, a member can be declared as a pointer to the structure type in which it appears as long as the structure type has a tag. Questo consente di creare elenchi di strutture collegati.This allows you to create linked lists of structures.

Le strutture seguono lo stesso ambito di altri identificatori.Structures follow the same scoping as other identifiers. Gli identificatori di struttura devono essere distinti da altri tag di struttura, unione ed enumerazione con la stessa visibilità.Structure identifiers must be distinct from other structure, union, and enumeration tags with the same visibility.

Ogni elemento struct-declaration in un elemento struct-declaration-list deve essere univoco all'interno dell'elenco.Each struct-declaration in a struct-declaration-list must be unique within the list. Tuttavia, i nomi di identificatori in un elemento struct-declaration-list non devono essere univoci rispetto ai nomi delle variabili comuni o agli identificatori presenti in altri elenchi di dichiarazioni di strutture.However, identifier names in a struct-declaration-list do not have to be distinct from ordinary variable names or from identifiers in other structure declaration lists.

Le strutture annidate sono accessibili come se fossero state dichiarate a livello di ambito file.Nested structures can also be accessed as though they were declared at the file-scope level. Ad esempio, data la seguente dichiarazione:For example, given this declaration:

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

queste dichiarazioni sono entrambe valide:these declarations are both legal:

struct a var3;  
struct b var4;  

EsempiExamples

In questi esempi vengono illustrate le dichiarazioni di strutture:These examples illustrate structure declarations:

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

La struttura employee dispone di tre membri: name, id e class.The employee structure has three members: name, id, and class. Il membro name è una matrice di 20 elementi e id e class sono membri semplici, rispettivamente con il tipo int e long.The name member is a 20-element array, and id and class are simple members with int and long type, respectively. L'identificatore employee è l'identificatore di struttura.The identifier employee is the structure identifier.

struct employee student, faculty, staff;  

In questo esempio vengono definiti tre variabili di struttura: student, faculty e staff.This example defines three structure variables: student, faculty, and staff. Ogni struttura presenta lo stesso elenco di tre membri.Each structure has the same list of three members. I membri vengono dichiarati per avere il tipo di struttura employee, definito nell'esempio precedente.The members are declared to have the structure type employee, defined in the previous example.

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

La struttura complex contiene due membri con il tipo float, x e y.The complex structure has two members with float type, x and y. Il tipo di struttura non presenta tag ed è pertanto senza nome o anonimo.The structure type has no tag and is therefore unnamed or anonymous.

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

I primi due membri della struttura sono una variabile char e un puntatore a un valore float.The first two members of the structure are a char variable and a pointer to a float value. Il terzo membro, next, viene dichiarato come un puntatore al tipo di struttura che si sta definendo (sample).The third member, next, is declared as a pointer to the structure type being defined (sample).

Le strutture anonime possono essere utili quando non è necessario il tag denominato.Anonymous structures can be useful when the tag named is not needed. Questa situazione si verifica quando una dichiarazione definisce tutte le istanze della struttura.This is the case when one declaration defines all structure instances. Ad esempio:For example:

struct  
{  
    int x;  
    int y;  
} mystruct;  

Le strutture incorporate sono spesso anonime.Embedded structures are often anonymous.

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

Sezione specifica MicrosoftMicrosoft Specific

Il compilatore consente l'utilizzo di una matrice senza dimensione o di dimensione pari a zero come ultimo membro di una struttura.The compiler allows an unsized or zero-sized array as the last member of a structure. Questa operazione può risultare utile se la dimensione di una matrice costante è diversa quando viene utilizzata in situazioni differenti.This can be useful if the size of a constant array differs when used in various situations. La dichiarazione di una struttura è simile alla seguente:The declaration of such a structure looks like this:

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

Le matrici senza dimensione possono apparire solo come ultimo membro di una struttura.Unsized arrays can appear only as the last member of a structure. Le strutture contenenti le dichiarazioni di matrice senza dimensione possono essere annidate in altre strutture purché nelle strutture di inclusione non siano dichiarati altri membri.Structures containing unsized array declarations can be nested within other structures as long as no further members are declared in any enclosing structures. Le matrici di queste strutture non sono consentite.Arrays of such structures are not allowed. L'operatore sizeof, applicato a una variabile di questo tipo o al tipo stesso, presuppone il valore 0 per la dimensione della matrice.The sizeof operator, when applied to a variable of this type or to the type itself, assumes 0 for the size of the array.

Le dichiarazioni della struttura possono essere specificate senza un dichiaratore quando sono membri di un'altra struttura o unione.Structure declarations can also be specified without a declarator when they are members of another structure or union. I nomi dei campi vengono promossi alla struttura di inclusione.The field names are promoted into the enclosing structure. Ad esempio, una struttura senza nome avrà il seguente aspetto:For example, a nameless structure looks like this:

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

Per altre informazioni sui riferimenti alle strutture, vedere Membri di strutture e unioni.See Structure and Union Members for information about structure references.

Fine sezione specifica MicrosoftEND Microsoft Specific

Vedere ancheSee Also

Dichiaratori e dichiarazioni di variabiliDeclarators and Variable Declarations