La struttura in C è un tipo di dati definito dall'utente che può essere utilizzato per raggruppare elementi di tipi possibilmente diversi in un unico tipo. IL parola chiave struct viene utilizzato per definire la struttura nel linguaggio di programmazione C. Gli elementi nella struttura sono chiamati its membro e possono essere di qualsiasi tipo di dati valido.
Dichiarazione della struttura C
Dobbiamo dichiarare la struttura in C prima di usarla nel nostro programma. Nella dichiarazione della struttura, specifichiamo le sue variabili membro insieme al loro tipo di dati. Possiamo usare la parola chiave struct per dichiarare la struttura in C usando la seguente sintassi:
Sintassi
struct structure_name { data_type member_name1; data_type member_name1; .... .... };> La sintassi precedente è anche chiamata modello di struttura o prototipo di struttura e nella dichiarazione non viene allocata memoria alla struttura.
Definizione della struttura C
Per utilizzare la struttura nel nostro programma, dobbiamo definirne l'istanza. Possiamo farlo creando variabili del tipo struttura. Possiamo definire le variabili di struttura utilizzando due metodi:
1. Dichiarazione di variabile di struttura con modello di struttura
struct structure_name { data_type member_name1; data_type member_name1; .... .... } variable1, varaible2, ... ;> 2. Dichiarazione della variabile di struttura dopo il modello di struttura
// structure declared beforehand struct structure_name variable1, variable2 , .......;>
Accedere ai membri della struttura
Possiamo accedere ai membri della struttura utilizzando il file ( . ) operatore punto.
Sintassi
structure_name.member1; strcuture_name.member2;>
Nel caso in cui abbiamo un puntatore alla struttura, possiamo anche utilizzare l'operatore freccia per accedere ai membri.
Inizializza membri della struttura
Membri della struttura non può essere inizializzato con la dichiarazione. Ad esempio, il seguente programma C non riesce nella compilazione.
struct Point { int x = 0; // COMPILER ERROR: cannot initialize members here int y = 0; // COMPILER ERROR: cannot initialize members here };> Il motivo dell'errore sopra riportato è semplice. Quando viene dichiarato un tipo di dati, non viene allocata memoria per esso. La memoria viene allocata solo quando vengono create le variabili.
Possiamo inizializzare i membri della struttura in 3 modi che sono i seguenti:
- Utilizzo dell'operatore di assegnazione.
- Utilizzo dell'elenco degli inizializzatori.
- Utilizzo dell'elenco degli inizializzatori designati.
1. Inizializzazione utilizzando l'operatore di assegnazione
struct structure_name str; str.member1 = value1; str.member2 = value2; str.member3 = value3; . . .>
2. Inizializzazione utilizzando l'elenco degli inizializzatori
struct structure_name str = { value1, value2, value3 };> In questo tipo di inizializzazione i valori vengono assegnati in ordine sequenziale così come dichiarati nel template della struttura.
3. Inizializzazione utilizzando l'elenco degli inizializzatori designati
L'inizializzazione designata consente di inizializzare i membri della struttura in qualsiasi ordine. Questa funzionalità è stata aggiunta nello standard C99.
struct structure_name str = { .member1 = value1, .member2 = value2, .member3 = value3 };> L'inizializzazione designata è supportata solo in C ma non in C++.
Esempio di struttura in C
Il seguente programma C mostra come utilizzare le strutture
C
// C program to illustrate the use of structures> #include> > // declaring structure with name str1> struct> str1 {> >int> i;> >char> c;> >float> f;> >char> s[30];> };> > // declaring structure with name str2> struct> str2 {> >int> ii;> >char> cc;> >float> ff;> } var;>// variable declaration with structure template> > // Driver code> int> main()> {> >// variable declaration after structure template> >// initialization with initializer list and designated> >// initializer list> >struct> str1 var1 = { 1,>'A'>, 1.00,>'techcodeview.com'> },> >var2;> >struct> str2 var3 = { .ff = 5.00, .ii = 5, .cc =>'a'> };> > >// copying structure using assignment operator> >var2 = var1;> > >printf>(>'Struct 1:
i = %d, c = %c, f = %f, s = %s
'>,> >var1.i, var1.c, var1.f, var1.s);> >printf>(>'Struct 2:
i = %d, c = %c, f = %f, s = %s
'>,> >var2.i, var2.c, var2.f, var2.s);> >printf>(>'Struct 3
i = %d, c = %c, f = %f
'>, var3.ii,> >var3.cc, var3.ff);> > >return> 0;> }> |
>
algoritmo per rsa
>Produzione
Struct 1: i = 1, c = A, f = 1.000000, s = techcodeview.com Struct 2: i = 1, c = A, f = 1.000000, s = techcodeview.com Struct 3 i = 5, c = a, f = 5.000000>
typedef per le strutture
IL typedef La parola chiave viene utilizzata per definire un alias per il tipo di dati già esistente. Nelle strutture, dobbiamo usare la parola chiave struct insieme al nome della struttura per definire le variabili. A volte, ciò aumenta la lunghezza e la complessità del codice. Possiamo usare typedef per definire un nuovo nome più breve per la struttura.
Esempio
C
// C Program to illustrate the use of typedef with> // structures> #include> > // defining structure> struct> str1 {> >int> a;> };> > // defining new name for str1> typedef> struct> str1 str1;> > // another way of using typedef with structures> typedef> struct> str2 {> >int> x;> } str2;> > int> main()> {> >// creating structure variables using new names> >str1 var1 = { 20 };> >str2 var2 = { 314 };> > >printf>(>'var1.a = %d
'>, var1.a);> >printf>(>'var2.x = %d'>, var2.x);> > >return> 0;> }> |
>
>Produzione
var1.a = 20 var2.x = 314>
Strutture nidificate
Il linguaggio C ci consente di inserire una struttura in un'altra come membro. Questo processo è chiamato annidamento e tali strutture sono chiamate strutture annidate. Esistono due modi in cui possiamo annidare una struttura in un'altra:
1. Nidificazione della struttura incorporata
In questo metodo, la struttura nidificata viene dichiarata anche all'interno della struttura genitore.
Esempio
struct parent { int member1; struct member_str member2 { int member_str1; char member_str2; ... } ... }> 2. Nidificazione di strutture separate
In questo metodo, due strutture vengono dichiarate separatamente e quindi la struttura del membro viene nidificata all'interno della struttura principale.
Esempio
struct member_str { int member_str1; char member_str2; ... } struct parent { int member1; struct member_str member2; ... }> Una cosa da notare qui è che la dichiarazione della struttura dovrebbe essere sempre presente prima della sua definizione come membro della struttura. Ad esempio, il la dichiarazione seguente non è valida poiché la struttura mem non è definita quando viene dichiarata all'interno della struttura genitore.
struct parent { struct mem a; }; struct mem { int var; };> Accesso ai membri nidificati
Possiamo accedere ai membri nidificati utilizzando lo stesso operatore punto ( . ) due volte come mostrato:
str_parent.str_child .member;>
Esempio di annidamento della struttura
C
// C Program to illustrate structure nesting along with> // forward declaration> #include> > // child structure declaration> struct> child {> >int> x;> >char> c;> };> > // parent structure declaration> struct> parent {> >int> a;> >struct> child b;> };> > // driver code> int> main()> {> >struct> parent var1 = { 25, 195,>'A'> };> > >// accessing and printing nested members> >printf>(>'var1.a = %d
'>, var1.a);> >printf>(>'var1.b.x = %d
'>, var1.b.x);> >printf>(>'var1.b.c = %c'>, var1.b.c);> > >return> 0;> }> |
>
>Produzione
var1.a = 25 var1.b.x = 195 var1.b.c = A>
Puntatore di struttura in C
Possiamo definire un puntatore che punta alla struttura come qualsiasi altra variabile. Tali puntatori sono generalmente chiamati Puntatori di struttura . Possiamo accedere ai membri della struttura puntati dal puntatore della struttura utilizzando il comando ( -> ) operatore freccia.
Esempio di puntatore di struttura
C
matematica discreta con negazione
// C program to illustrate the structure pointer> #include> > // structure declaration> struct> Point {> >int> x, y;> };> > int> main()> {> >struct> Point str = { 1, 2 };> > >// p2 is a pointer to structure p1> >struct> Point* ptr = &str;> > >// Accessing structure members using structure pointer> >printf>(>'%d %d'>, ptr->x, ptr->y);> > >return> 0;> }> |
>
>Produzione
1 2>
Strutture autoreferenziali
Le strutture autoreferenziali in C sono quelle strutture che contengono riferimenti al loro stesso tipo, cioè contengono un membro del puntatore di tipo che punta allo stesso tipo di struttura.
Esempio di strutture autoreferenziali
struct structure_name { data_type member1; data_type member2; struct structure_name* str; }> C
// C program to illustrate the self referential structures> #include> > // structure template> typedef> struct> str {> >int> mem1;> >int> mem2;> >struct> str* next;> }str;> > // driver code> int> main()> {> >str var1 = { 1, 2, NULL };> >str var2 = { 10, 20, NULL };> > >// assigning the address of var2 to var1.next> >var1.next = &var2;> > >// pointer to var1> >str *ptr1 = &var1;> > >// accessing var2 members using var1> >printf>(>'var2.mem1: %d
var2.mem2: %d'>, ptr1->successivo->mem1,> >ptr1->successivo->mem2);> > >return> 0;> }> |
>
>Produzione
var2.mem1: 10 var2.mem2: 20>
Tali tipi di strutture vengono utilizzati in diverse strutture dati come per definire i nodi di elenchi collegati, alberi, ecc.
Imbottitura e imballaggio della struttura C
Tecnicamente, la dimensione della struttura in C dovrebbe essere la somma delle dimensioni dei suoi membri. Ma potrebbe non essere vero nella maggior parte dei casi. La ragione di ciò è l'imbottitura della struttura.
Imbottitura della struttura è il concetto di aggiungere più byte vuoti nella struttura per allineare naturalmente i dati membri nella memoria. Viene fatto per ridurre al minimo i cicli di lettura della CPU per recuperare diversi membri dati nella struttura.
quanto fa 10 su 60?
Ci sono alcune situazioni in cui dobbiamo comprimere saldamente la struttura rimuovendo i byte vuoti. In questi casi, utilizziamo Imballaggio della struttura. Il linguaggio C fornisce due modi per impacchettare la struttura:
- Utilizzo del pacchetto #pragma(1)
- Utilizzando __attribute((imballato))__
Esempio di imbottitura e imballaggio della struttura
C
// C program to illustrate structure padding and packing> #include> > // structure with padding> struct> str1 {> >char> c;> >int> i;> };> > struct> str2 {> >char> c;> >int> i;> } __attribute((packed)) __;>// using structure packing> > // driver code> int> main()> {> > >printf>(>'Size of str1: %d
'>,>sizeof>(>struct> str1));> >printf>(>'Size of str2: %d
'>,>sizeof>(>struct> str2));> >return> 0;> }> |
>
>Produzione
Size of str1: 8 Size of str2: 5>
Come possiamo vedere, la dimensione della struttura varia quando viene eseguito l'impaccamento della struttura.
Per saperne di più sul riempimento e sull'impaccamento della struttura, fare riferimento a questo articolo: i campi bit vengono utilizzati per specificare la lunghezza dei membri della struttura in bit. Quando conosciamo la lunghezza massima del membro, possiamo utilizzare i campi bit per specificare la dimensione e ridurre il consumo di memoria.
Sintassi dei campi di bit
struct structure_name { data_type member_name : width_of_bit-field; };> Esempio di campi bit
C
// C Program to illustrate bit fields in structures> #include> > // declaring structure for reference> struct> str1 {> >int> a;> >char> c;> };> > // structure with bit fields> struct> str2 {> >int> a : 24;>// size of 'a' is 3 bytes = 24 bits> >char> c;> };> > // driver code> int> main()> {> >printf>(>'Size of Str1: %d
Size of Str2: %d'>,> >sizeof>(>struct> str1),>sizeof>(>struct> str2));> >return> 0;> }> |
>
>Produzione
Size of Str1: 8 Size of Str2: 4>
Come possiamo vedere, la dimensione della struttura viene ridotta quando si utilizza il campo bit per definire la dimensione massima del membro “a”.
Usi della struttura in C
Le strutture C vengono utilizzate per quanto segue:
- La struttura può essere utilizzata per definire i tipi di dati personalizzati che possono essere utilizzati per creare alcuni tipi di dati complessi come data, ora, numeri complessi, ecc. che non sono presenti nel linguaggio.
- Può essere utilizzato anche nell'organizzazione dei dati in cui è possibile archiviare una grande quantità di dati in campi diversi.
- Le strutture vengono utilizzate per creare strutture dati come alberi, elenchi collegati, ecc.
- Possono anche essere utilizzati per restituire più valori da una funzione.
Limitazioni delle strutture C
Nel linguaggio C, le strutture forniscono un metodo per raggruppare dati di diversi tipi. Una struttura è uno strumento utile per gestire un gruppo di elementi di dati logicamente correlati. Tuttavia, le strutture C presentano anche alcune limitazioni.
- Consumo di memoria maggiore: è dovuto all'imbottitura della struttura. Nessun nascondimento dei dati: le strutture C non consentono l'occultamento dei dati. È possibile accedere ai membri della struttura da qualsiasi funzione, ovunque nell'ambito della struttura. Funzioni all'interno della struttura: le strutture C non consentono funzioni all'interno della struttura, quindi non possiamo fornire le funzioni associate. Membri statici: la struttura C non può avere membri statici all'interno del proprio corpo. Creazione di costruzioni in Structure: le strutture in C non possono avere un costruttore all'interno di Structures.
articoli Correlati
- Strutture C e strutture C++
