位置:首頁 > 高級語言 > C語言教學 > C語言結構體

C語言結構體

C語言中數組允許定義類型的變量,可容納相同類型的多個數據項,但結構體在C語言編程中,它允許定義不同種類的數據項可供其他用戶定義的數據類型。

結構是用來代表一個記錄,假設要跟蹤圖書館的書籍。可能要跟蹤有關每本書以下屬性:

  • Title - 標題

  • Author - 作者

  • Subject - 科目

  • Book ID - 編號

定義結構體

定義一個結構體,必須使用結構體的struct語句。該struct語句定義了一個新的數據類型,程序不止一個成員。struct語句的格式是這樣的:

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

結構體(structure)標簽是可選的,每個成員的定義是一個正常的變量定義,如 int i; 或 float f; 或任何其他有效的變量的定義。在結構的定義的結尾,最後的分號之前,可以指定一個或多個結構變量,但它是可選的。這裡是聲明書(Book)的結構方式:

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

訪問結構體成員

要訪問結構體的任何成員,我們使用成員訪問運算符(.)成員訪問運算符是編碼作為結構體變量名,並且希望訪問結構體部件。使用struct關鍵字來定義結構體類型的變量。以下為例子來解釋結構的用法:

#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
", Book1.title);
   printf( "Book 1 author : %s
", Book1.author);
   printf( "Book 1 subject : %s
", Book1.subject);
   printf( "Book 1 book_id : %d
", Book1.book_id);

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

   return 0;
}

讓我們編譯和運行上麵的程序,這將產生以下結果:

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

結構體作為函數參數

可以傳遞一個結構作為函數的參數,非常類似傳遞任何其他變量或指針。訪問可以象在上麵的例子已經訪問類似結構變量的方式:

#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
", book.title);
   printf( "Book author : %s
", book.author);
   printf( "Book subject : %s
", book.subject);
   printf( "Book book_id : %d
", book.book_id);
}

讓我們編譯和運行上麵的程序,這將產生以下結果:

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

指針結構

非常相似定義指針結構,來定義指向任何其他變量,如下所示:

struct Books *struct_yiibaier;

現在,可以存儲結構變量的地址在上麵定義的指針變量。為了找到一個結構變量的地址,將使用運算符&在結構體的名字之前,如下所示:

struct_yiibaier = &Book1;

訪問使用一個指向結構的結構的成員,必須使用  -> 運算符如下:

struct_yiibaier->title;

讓我們重新寫上麵的例子中使用結構指針,希望這將能夠讓我們更容易地理解概念:

#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
", book->title);
   printf( "Book author : %s
", book->author);
   printf( "Book subject : %s
", book->subject);
   printf( "Book book_id : %d
", book->book_id);
}

讓我們編譯和運行上麵的程序,這將產生以下結果:

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

位字段

位字段允許數據在一個結構體包裝。這是特彆有用的,當內存或存儲數據非常寶貴。典型的例子:

  • 包裝幾個對象到一個機器語言。例如1位標誌能夠壓縮長度

  • 讀取外部的文件格式 - 非標準的文件格式可以讀出。例如: 9位整數。

C語言允許我們通過結構定義:bit 長度的變量之後。例如:

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;

在這裡,packed_struct包含6個成員:四個1位標誌s f1..f3, 一個 4 位類型和9位my_int。

C語言自動包裝上述位字段儘可能緊湊,條件是字段的最大長度小於或等於計算機的整數字長。如果不是這種情況,那麼一些編譯器可以允許,而其他將重疊存儲在下一個字段的存儲器。