Latest web development tutorials

C-Struktur

C ermöglicht es Ihnen , eine Anordnung des gleichen Typs zu definieren , können in einer variablen Datenelementen gespeichert werden, ist dieStruktur der C - Programmierung andere benutzerdefinierte Datentypen zur Verfügung, die Sie verschiedene Arten von Datenelementen zu speichern.

Struktur verwendet, um einen Datensatz darstellen: Angenommen, Sie dynamische Bibliothek Bücher verfolgen möchten, können Sie den Überblick über jedes Buch die folgenden Eigenschaften behalten müssen:

  • Titel
  • Autor
  • Thema
  • Buch-ID

Definition Struktur

Um die Struktur zu definieren, müssen Sie dieStruktur - Anweisung verwenden.struct Anweisung definiert eine neue Datentyp, der eine Vielzahl von Elementen enthält, ist das Format struct-Anweisung ist wie folgt:

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

Struktur - Tagoptional ist, ist jedes Mitglied Definition der Standard - Definition einer Variablen, wie int i; oder f schwimmen oder andere gültige Variablendefinitionen. Am Ende der Struktur definiert, die letzte vor dem Semikolon, können Sie eine oder mehrere Strukturvariablen angeben, die optional ist. Hier ist die Strukturdeklaration Buchen bis zum:

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

Der Zugang zu Strukturelement

Um Mitglieder der Struktur zugreifen zu können , verwenden wirden Member - Access-Operator (.).Mitglied Zugang Betreiber ist eine Periode Struktur Variablennamen und Strukturen unserer Mitglieder zwischen zugreifen möchten. Sie können den Typ einer Variablen Struktur mitdem Schlüsselwort structdefinieren. Das folgende Beispiel demonstriert die Verwendung der Struktur:

#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;
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt es die folgenden Ergebnisse:

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

Struktur als Funktionsparameter

Sie können die Struktur als Funktionsparameter setzen, den Senat auf ähnliche Weise wie andere Arten von Variablen oder Zeiger. Sie können das obige Beispiel die Art und Weise verwenden, um Strukturvariablen zugreifen:

#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);
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt es die folgenden Ergebnisse:

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

Zeiger auf eine Struktur

Sie können einen Zeiger auf die Struktur, die Art und Weise, die Definition von Links zu anderen ähnlichen Arten von Zeigervariablen definieren, wie folgt:

struct Books *struct_pointer;

Jetzt können Sie Speicherstruktur Variablen in der obigen Definition eines Zeigervariable adressieren. Um die Adresse der Strukturvariable zu finden, den Operator & vor dem Namen der Struktur, wie folgt:

struct_pointer = &Book1;

Um den Zeiger verwenden, um die Mitgliederstruktur verweist auf die Struktur zugreifen zu können, müssen Sie verwenden, um die Operator -> wie folgt:

struct_pointer->title;

Lassen Sie uns die Struktur Zeiger verwenden das obige Beispiel neu zu schreiben, es wird Ihnen das Konzept der Struktur Zeiger helfen zu verstehen:

#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);
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt es die folgenden Ergebnisse:

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

bit-Feld

Einige Informationen werden gespeichert und muss nicht ein volles Byte zu nehmen, während für nur eine oder wenige Bits ausmacht. Wenn beispielsweise ein Schalter, nur zwei Zustände 0 und 1, mit einem binären Bit zu speichern. So speichern Sie Speicherplatz, und der Prozess ist einfach, C-Sprache und stellt eine Datenstruktur "Bit-Feld" oder als "Bit-Segment."

Die so genannte "Bitfeld" ist ein Byte in dem binären in mehrere verschiedene Bereiche unterteilt ist, und geben die Anzahl von Bits in jeder Region. Jede Domain hat einen Domain-Namen, so dass das Programm nach dem Domain-Namen zu betreiben. So können wir mehrere verschiedene Objekte mit einem Byte-Binär-Bit-Feld darstellen setzen.

Typische Beispiele:

  • Bei Verwendung eines Schalters mit einer binären Speicherung, nur zwei Zustände 0 und 1.
  • Lesen Sie externe Dateiformate - können Nicht-Standard-Dateiformate gelesen werden. Zum Beispiel: 9-Bit-Integer.

Beschreibung Legt Bit Feldgrößen und ein Bit-Feld

Bit Felddefinitionen und Strukturdefinitionen ähnlich der Form:

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

Welche Form Bit-Feld Liste ist:

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

Zum Beispiel:

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

In der gleichen Weise beschrieben Bitfeld Variablen und Strukturvariablen beschrieben. Kann verwendet werden, nachdem die erste Definition beschreibt und definiert Anweisungen entweder diese direkt auf drei Arten darstellen. Zum Beispiel:

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

Beschreibung für bs variablen Daten, insgesamt zwei Bytes. Welcher Anteil von 8-Bit-Feld b ein Bit-Feld für zwei entfielen, auf die 6-Bit-Feld c.

Lassen Sie uns ein Beispiel an:

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;

Hier enthält packed_struct sechs Mitgliedern: vier 1-Bit-Kennung f1..f4, ein 4-Bit-Typ und ein 9-Bit-my_int.

Für die Definition des Bitfeldes gibt es folgende Anweisungen:

  • Ein Bit-Feld muss in einem einzigen Byte gespeichert werden, nicht zwei Bytes umfassen. Beispielsweise wenn ein Byte eine andere Domäne zu speichern, kann die nächste Speichereinheit aus dem Bit-Feld sollte nicht genug Platz gelassen wird. Es kann auch absichtlich Domain von der nächsten Einheit überprüft. Zum Beispiel:

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

    In diesem Bitfeld Definition ist ein vier Bits des ersten Bytes nach vier sagten, sie nicht 0 zu füllen hat verwenden, b aus dem zweiten Byte, besetzen 4 belegt c vier.

  • Da das Bit-Feld nicht über die zwei Bytes zulässig ist, so dass die Länge des Bitfeldes kann nicht größer sein als eine Byte-Länge, ist, dass nicht mehr als 8 binär. Wenn die maximale Länge größer ist als der gesamte Computer-Wortlänge ist, können einige Compiler Speicher Überlappungsbereich zu ermöglichen, und einige Compiler kann mehr als ein Teil des Speicherdomäne des nächsten Wortes gesetzt.
  • Bit-Felder können unbenannte Bit-Feld sein, dann ist es nur als Füll- oder Einstellungsposition verwendet wird. Unnamed Bitfeld kann nicht verwendet werden. Zum Beispiel:

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

Wie aus der obigen Analyse ersichtlich ist, ist das Bit-Feld, im Wesentlichen eine Art von Struktur, aber ihre Mitglieder sind durch binäre Verteilung.

Verwenden Bit-Felder

Die Mitglieder, die die gleiche Struktur und Bit-Feld, seiner allgemeinen Form verwenden:

    位域变量名·位域名

Bit-Feld ermöglicht eine Vielzahl von Formaten.

Betrachten Sie die folgenden Beispiele:

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);	/* 用指针方式输出了这三个域的值 */
}

Das Beispielprogramm definiert die Bit-Feldstruktur bs, Drei-Bit-Feld ist a, b, c. Beschreibung der Art der variablen Bit-bs und zeigt bs Typ Zeigervariable PBIT. Dies stellt ein Bit-Feld auch verwendet, um Zeiger sein kann.