C - Strutture

Gli array consentono di definire il tipo di variabili che possono contenere più elementi di dati dello stesso tipo. Allo stesso modostructure è un altro tipo di dati definito dall'utente disponibile in C che consente di combinare elementi di dati di diversi tipi.

Le strutture vengono utilizzate per rappresentare un record. Supponi di voler tenere traccia dei tuoi libri in una biblioteca. Potresti voler monitorare i seguenti attributi di ogni libro:

  • Title
  • Author
  • Subject
  • ID libro

Definizione di una struttura

Per definire una struttura, è necessario utilizzare il structdichiarazione. L'istruzione struct definisce un nuovo tipo di dati, con più di un membro. Il formato dell'istruzione struct è il seguente:

struct [structure tag] {

   member definition;
   member definition;
   ...
   member definition;
} [one or more structure variables];

Il structure tagè opzionale e ogni definizione di membro è una normale definizione di variabile, come int i; o float f; o qualsiasi altra definizione di variabile valida. Alla fine della definizione della struttura, prima del punto e virgola finale, è possibile specificare una o più variabili di struttura ma è opzionale. Ecco il modo in cui dichiareresti la struttura del libro:

struct Books {
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;

Accesso ai membri della struttura

Per accedere a qualsiasi membro di una struttura, utilizziamo il member access operator (.). L'operatore di accesso al membro è codificato come un periodo tra il nome della variabile di struttura e il membro della struttura a cui si desidera accedere. Useresti la parola chiavestructper definire variabili di tipo struttura. L'esempio seguente mostra come utilizzare una struttura in un programma:

#include <stdio.h>
#include <string.h>
 
struct Books {
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( ) {

   struct Books Book1;        /* Declare Book1 of type Book */
   struct Books Book2;        /* Declare Book2 of type Book */
 
   /* book 1 specification */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;

   /* book 2 specification */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* print Book1 info */
   printf( "Book 1 title : %s\n", Book1.title);
   printf( "Book 1 author : %s\n", Book1.author);
   printf( "Book 1 subject : %s\n", Book1.subject);
   printf( "Book 1 book_id : %d\n", Book1.book_id);

   /* print Book2 info */
   printf( "Book 2 title : %s\n", Book2.title);
   printf( "Book 2 author : %s\n", Book2.author);
   printf( "Book 2 subject : %s\n", Book2.subject);
   printf( "Book 2 book_id : %d\n", Book2.book_id);

   return 0;
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

Strutture come argomenti di funzione

È possibile passare una struttura come argomento di una funzione nello stesso modo in cui si passa qualsiasi altra variabile o puntatore.

#include <stdio.h>
#include <string.h>
 
struct Books {
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};

/* function declaration */
void printBook( struct Books book );

int main( ) {

   struct Books Book1;        /* Declare Book1 of type Book */
   struct Books Book2;        /* Declare Book2 of type Book */
 
   /* book 1 specification */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;

   /* book 2 specification */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* print Book1 info */
   printBook( Book1 );

   /* Print Book2 info */
   printBook( Book2 );

   return 0;
}

void printBook( struct Books book ) {

   printf( "Book title : %s\n", book.title);
   printf( "Book author : %s\n", book.author);
   printf( "Book subject : %s\n", book.subject);
   printf( "Book book_id : %d\n", book.book_id);
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Book title : C Programming
Book author : Nuha Ali
Book subject : C Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700

Puntatori alle strutture

Puoi definire puntatori a strutture nello stesso modo in cui definisci puntatori a qualsiasi altra variabile -

struct Books *struct_pointer;

Ora è possibile memorizzare l'indirizzo di una variabile di struttura nella variabile puntatore definita sopra. Per trovare l'indirizzo di una variabile di struttura, inserisci il carattere "&"; operatore prima del nome della struttura come segue:

struct_pointer = &Book1;

Per accedere ai membri di una struttura utilizzando un puntatore a quella struttura, è necessario utilizzare l'operatore → come segue:

struct_pointer->title;

Riscriviamo l'esempio precedente usando il puntatore alla struttura.

#include <stdio.h>
#include <string.h>
 
struct Books {
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};

/* function declaration */
void printBook( struct Books *book );
int main( ) {

   struct Books Book1;        /* Declare Book1 of type Book */
   struct Books Book2;        /* Declare Book2 of type Book */
 
   /* book 1 specification */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;

   /* book 2 specification */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* print Book1 info by passing address of Book1 */
   printBook( &Book1 );

   /* print Book2 info by passing address of Book2 */
   printBook( &Book2 );

   return 0;
}

void printBook( struct Books *book ) {

   printf( "Book title : %s\n", book->title);
   printf( "Book author : %s\n", book->author);
   printf( "Book subject : %s\n", book->subject);
   printf( "Book book_id : %d\n", book->book_id);
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Book title : C Programming
Book author : Nuha Ali
Book subject : C Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700

Campi di bit

I campi di bit consentono di impacchettare i dati in una struttura. Ciò è particolarmente utile quando la memoria o l'archiviazione dei dati è fondamentale. Esempi tipici includono:

  • Imballare diversi oggetti in una parola macchina. ad esempio, i flag di 1 bit possono essere compattati.

  • Lettura di formati di file esterni: è possibile leggere formati di file non standard, ad esempio interi a 9 bit.

C ci permette di farlo in una definizione di struttura inserendo: bit length dopo la variabile. Ad esempio:

struct packed_struct {
   unsigned int f1:1;
   unsigned int f2:1;
   unsigned int f3:1;
   unsigned int f4:1;
   unsigned int type:4;
   unsigned int my_int:9;
} pack;

Qui, il pacchetto_struct contiene 6 membri: quattro flag a 1 bit f1..f3, un tipo a 4 bit e un my_int a 9 bit.

C impacchetta automaticamente i campi di bit di cui sopra nel modo più compatto possibile, a condizione che la lunghezza massima del campo sia inferiore o uguale alla lunghezza della parola intera del computer. Se questo non è il caso, alcuni compilatori potrebbero consentire la sovrapposizione della memoria per i campi mentre altri memorizzerebbero il campo successivo nella parola successiva.