Latest web development tutorials

struttura C

C consente di definire una serie di stesso tipo può essere memorizzato in un elementi di dati variabili, lastruttura è la programmazione C altri tipi di dati definiti dall'utente disponibile, che consente di memorizzare diversi tipi di elementi di dati.

Struttura utilizzato per rappresentare un record, si supponga di voler monitorare libri della biblioteca dinamica, potrebbe essere necessario tenere traccia di ogni libro le seguenti proprietà:

  • titolo
  • autore
  • soggetto
  • libro ID

struttura definizione

Al fine di definire la struttura, è necessario utilizzare l'istruzionestruct.dichiarazione struct definisce un nuovo tipo di dati che contiene una pluralità di elementi, l'istruzione di formato struct è il seguente:

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

tag struttura è facoltativo, ogni definizione membro è la definizione standard di una variabile, come ad esempio int i; o float f; o altre definizioni valide variabili.Alla fine della struttura definita, l'ultima prima del punto e virgola, è possibile specificare una o più variabili strutturali, che è facoltativo. Ecco la struttura di dichiarazione Prenota entro:

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

L'accesso a membro della struttura

Per accedere ai membri della struttura, si usal'operatore di accesso utente (.).operatore di accesso Utente è una struttura d'epoca nomi e le strutture dei nostri membri variabile vogliono accedere mezzo. È possibile definire il tipo di una struttura variabile utilizzandola parola chiave struct.L'esempio seguente illustra l'uso della struttura:

#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;        /* 声明 Book1,类型为 Book */
   struct Books Book2;        /* 声明 Book2,类型为 Book */
 
   /* Book1 详述 */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;

   /* Book2 详述 */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* 输出 Book1 信息 */
   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);

   /* 输出 Book2 信息 */
   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 di cui sopra è compilato ed eseguito, produce i seguenti risultati:

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

Struttura come parametro funzione

È possibile inserire la struttura come un parametro di funzione, il modo Senato simile ad altri tipi di variabili o puntatori. È possibile utilizzare l'esempio precedente il modo di accedere alle variabili di struttura:

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

/* 函数声明 */
void printBook( struct Books book );
int main( )
{
   struct Books Book1;        /* 声明 Book1,类型为 Book */
   struct Books Book2;        /* 声明 Book2,类型为 Book */
 
   /* Book1 详述 */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;

   /* Book2 详述 */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* 输出 Book1 信息 */
   printBook( Book1 );

   /* 输出 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 di cui sopra è compilato ed eseguito, produce i seguenti risultati:

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

Puntatore a una struttura

È possibile definire un puntatore alla struttura, il modo in cui la definizione di legami con altri tipi simili di variabile puntatore, come segue:

struct Books *struct_pointer;

Ora è possibile indirizzare le variabili struttura di stoccaggio nella definizione di cui sopra di una variabile puntatore. Per trovare l'indirizzo della variabile struttura, l'operatore & davanti al nome della struttura, come segue:

struct_pointer = &Book1;

Per utilizzare il puntatore per accedere ai punti di struttura membro alla struttura, è necessario utilizzare l'operatore ->, come segue:

struct_pointer->title;

Usiamo il puntatore struttura di riscrivere l'esempio precedente, che vi aiuterà a capire il concetto di puntatori struttura:

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

/* 函数声明 */
void printBook( struct Books *book );
int main( )
{
   struct Books Book1;        /* 声明 Book1,类型为 Book */
   struct Books Book2;        /* 声明 Book2,类型为 Book */
 
   /* Book1 详述 */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;

   /* Book2 详述 */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* 通过传 Book1 的地址来输出 Book1 信息 */
   printBook( &Book1 );

   /* 通过传 Book2 的地址来输出 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 di cui sopra è compilato ed eseguito, produce i seguenti risultati:

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

campo di bit

Alcune informazioni sono registrate e non necessita di prendere un byte completo, mentre rappresentano solo uno o pochi bit. Ad esempio, quando si memorizza un interruttore, solo due stati 0 e 1, con un bit binario. Per risparmiare spazio di archiviazione, e il processo è semplice, il linguaggio C e fornisce una struttura di dati chiamata "campo di bit" o "segmento po '."

Il cosiddetto "campo di bit" è un byte nel binario diviso in diverse aree, e indica il numero di bit in ciascuna regione. Ogni dominio ha un nome di dominio, permettendo al programma di funzionare in base al nome di dominio. Così possiamo mettere molti oggetti diversi con un campo di byte di bit binari per rappresentare.

Esempi tipici:

  • Quando si memorizza un interruttore con un binario, solo due stati 0 e 1.
  • Leggi i formati di file esterni - si può leggere i formati di file non standard. Per esempio: 9-bit integer.

Descrizione Definisce variabili di campo bit e un campo di bit

definizioni dei campi Bit e le definizioni struttura simile alla forma:

    struct 位域结构名
        { 位域列表 };

Che formano dei campi di bit è:

    类型说明符 位域名: 位域长度 

Ad esempio:

struct bs{
    int a:8;
    int b:2;
    int c:6;
};

Nello stesso modo descritto variabili BITFIELD e variabili struttura descritta. Può essere utilizzato dopo la prima definizione descrive e definisce le istruzioni sia illustrano direttamente in tre modi. Ad esempio:

struct bs{
    int a:8;
    int b:2;
    int c:6;
}data;

Descrizione per dati variabili bs, un totale di due byte. Che rappresentano il campo di 8 bit un campo di bit b rappresentato per due, che rappresenta il campo di 6 bit c.

Diamo un'occhiata a un 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, packed_struct comprende sei membri: quattro identificatore F1..F4 1-bit, un tipo 4-bit e un 9-bit my_int.

Per la definizione del campo di bit vi sono le seguenti indicazioni:

  • Un campo di bit deve essere memorizzato in un singolo byte, non estendersi due byte. Come quando un byte non c'è abbastanza spazio a sinistra per memorizzare un altro dominio, dovrebbe essere il prossimo unità di memorizzazione dal campo di bit. Può anche intenzionalmente Inviato dominio dall'unità successivo. Ad esempio:

    struct bs{
        unsigned a:4;
        unsigned  :4;    /* 空域 */
        unsigned b:4;    /* 从下一单元开始存放 */
        unsigned c:4
    }
    

    In questa definizione campo di bit, a quattro bit del primo byte dopo quattro hanno detto di non usare per riempire 0, b dal secondo byte, occupando 4, c occupa quattro.

  • Poiché il campo di bit non è consentito attraverso i due byte, così la lunghezza del campo di bit non può essere superiore ad un byte di lunghezza, che non è più di 8 binario. Se la lunghezza massima è maggiore di tutta la lunghezza di parola del computer, alcuni compilatori possono consentire regione di sovrapposizione di memoria, e alcuni compilatori possono inserire più di una porzione del dominio della parola successiva archiviazione.
  • campi di bit può essere campo di bit senza nome, allora è utilizzato solo come riempimento o posizione di regolazione. campo di bit Senza nome non può essere utilizzato. Ad esempio:

    struct k{
        int a:1;
        int  :2;    /* 该 2 位不能使用 */
        int b:3;
        int c:2;
    };
    

Come si può vedere dalla precedente analisi, il campo di bit è essenzialmente un tipo di struttura, ma i suoi membri sono di distribuzione binaria.

campi Usa bit

Utenti che utilizzano la stessa struttura e campo di bit, la sua forma generale:

    位域变量名·位域名

Campo di bit permette una varietà di formati.

Considerate i seguenti esempi:

main(){
    struct bs{
        unsigned a:1;
        unsigned b:3;
        unsigned c:4;
    } bit,*pbit;
    bit.a=1;	/* 给位域赋值(应注意赋值不能超过该位域的允许范围) */
    bit.b=7;	/* 给位域赋值(应注意赋值不能超过该位域的允许范围) */
    bit.c=15;	/* 给位域赋值(应注意赋值不能超过该位域的允许范围) */
    printf("%d,%d,%d\n",bit.a,bit.b,bit.c);	/* 以整型量格式输出三个域的内容 */
    pbit=&bit;	/* 把位域变量 bit 的地址送给指针变量 pbit */
    pbit->a=0;	/* 用指针方式给位域 a 重新赋值,赋为 0 */
    pbit->b&=3;	/* 使用了复合的位运算符 "&=",相当于:pbit->b=pbit->b&3,位域 b 中原有值为 7,与 3 作按位与运算的结果为 3(111&011=011,十进制值为 3) */
    pbit->c|=1;	/* 使用了复合位运算符"|=",相当于:pbit->c=pbit->c|1,其结果为 15 */
    printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);	/* 用指针方式输出了这三个域的值 */
}

Il programma di esempio definisce il campo di bit struttura bs, campo di tre bit è a, b, c. Descrizione del tipo di bs bit variabili e BS di puntamento di tipo puntatore PBIT variabile. Questo rappresenta un campo di bit può anche essere puntatori usati.