C 數組容許定義可存儲相同類型數據項的變量,結構是 C 編程中另外一種用戶自定義的可用的數據類型,它容許您存儲不一樣類型的數據項。node
結構用於表示一條記錄,假設您想要跟蹤圖書館中書本的動態,您可能須要跟蹤每本書的下列屬性:編程
爲了定義結構,您必須使用 struct 語句。struct 語句定義了一個包含多個成員的新的數據類型,struct 語句的格式以下:數組
struct tag { member-list member-list member-list ... } variable-list ;
struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } book;
在通常狀況下,tag、member-list、variable-list 這 3 部分至少要出現 2 個。如下爲實例:數據結構
//此聲明聲明瞭擁有3個成員的結構體,分別爲整型的a,字符型的b和雙精度的c //同時又聲明告終構體變量s1 //這個結構體並無標明其標籤 struct { int a; char b; double c; } s1; //此聲明聲明瞭擁有3個成員的結構體,分別爲整型的a,字符型的b和雙精度的c //結構體的標籤被命名爲SIMPLE,沒有聲明變量 struct SIMPLE { int a; char b; double c; }; //用SIMPLE標籤的結構體,另外聲明瞭變量t一、t二、t3 struct SIMPLE t1, t2[20], *t3; //也能夠用typedef建立新類型 typedef struct { int a; char b; double c; } Simple2; //如今能夠用Simple2做爲類型聲明新的結構體變量 Simple2 u1, u2[20], *u3;
在上面的聲明中,第一個和第二聲明被編譯器看成兩個徹底不一樣的類型,即便他們的成員列表是同樣的,若是令 t3=&s1,則是非法的。編程語言
結構體的成員能夠包含其餘結構體,也能夠包含指向本身結構體類型的指針,而一般這種指針的應用是爲了實現一些更高級的數據結構如鏈表和樹等。ide
//此結構體的聲明包含了其餘的結構體 struct COMPLEX { char string[100]; struct SIMPLE a; }; //此結構體的聲明包含了指向本身類型的指針 struct NODE { char string[100]; struct NODE *next_node; };
若是兩個結構體互相包含,則須要對其中一個結構體進行不完整聲明,以下所示:函數
struct B; //對結構體B進行不完整聲明 //結構體A中包含指向結構體B的指針 struct A { struct B *partner; //other members; }; //結構體B中包含指向結構體A的指針,在A聲明完後,B也隨之進行聲明 struct B { struct A *partner; //other members; };
和其它類型變量同樣,對結構體變量能夠在定義時指定初始值。spa
#include <stdio.h> struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } book = {"C 語言", "RUNOOB", "編程語言", 123456}; int main() { printf("title : %s\nauthor: %s\nsubject: %s\nbook_id: %d\n", book.title, book.author, book.subject, book.book_id); }
執行輸出結果爲:指針
title : C 語言 author: RUNOOB subject: 編程語言 book_id: 123456
爲了訪問結構的成員,咱們使用成員訪問運算符(.)。成員訪問運算符是結構變量名稱和咱們要訪問的結構成員之間的一個句號。您能夠使用 struct 關鍵字來定義結構類型的變量。下面的實例演示告終構的用法:code
#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,類型爲 Books */ struct Books Book2; /* 聲明 Book2,類型爲 Books */ /* 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; }
當上面的代碼被編譯和執行時,它會產生下列結果:
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; }; /* 函數聲明 */ void printBook( struct Books book ); int main( ) { struct Books Book1; /* 聲明 Book1,類型爲 Books */ struct Books Book2; /* 聲明 Book2,類型爲 Books */ /* 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); }
當上面的代碼被編譯和執行時,它會產生下列結果:
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_pointer;
如今,您能夠在上述定義的指針變量中存儲結構變量的地址。爲了查找結構變量的地址,請把 & 運算符放在結構名稱的前面,以下所示:
struct_pointer = &Book1;
爲了使用指向該結構的指針訪問結構的成員,您必須使用 -> 運算符,以下所示:
struct_pointer->title;
使用結構指針來重寫上面的實例;
#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,類型爲 Books */ struct Books Book2; /* 聲明 Book2,類型爲 Books */ /* 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); }
當上面的代碼被編譯和執行時,它會產生下列結果:
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