結構體

結構體

重點:

        複合類型與結構體;

        數據抽象;

一、複合類型與結構體

            在實際問題中,一組數據往往具有不同的數據類型。例如,在學生登記表中,姓名應爲字符型;學號爲整型或者字符型;年齡爲整型,性別爲字符型等。顯然不能用一個數組來存放這一組數據。因爲數組各元素的類型和長度都必須一致,以便於編譯系統處理。爲了解決這個問題,C語言中給出了另一種構造數據類型——“結構(structrue)“或叫”結構體”。它相當於其它高級語言中的記錄。

              ”結構”是一種構造類型,它是由若干“成員”組成的。每一個成員可以是基本數據類型或者又是一個構造類型。  

               結構既然是一種“構造”而成的數據類型,那麼在說明和使用之前必須先定義它也就是構造它,如同在說明和調用函數之前要先定義函數一樣。

                定義結構的形式:struct 結構名

                                           {成員表列};             

    例:定義和訪問結構體

    

#include "stdafx.h"
int  main()
{
	struct complex_struct { double x,y;} z;
	double x=3.0;
	z.x=x;
	z.y=4.0;
	printf("struct value:z.x=%f z.y=%f\n",z.x,z.y);
	getchar();
	return 0;
}

    注意,上例中變量x和變量z的成員x的名字並不衝突,因爲變量z的成員x只能通過表達式z.x來訪問,編譯器可以從語法上區分哪個x是變量x,哪個x是變量z的成員。結構體Tag也可以定義在全局作用域中,這樣定義的Tag在其定義之後的各函數中都可以使用。

    結構體變量之間使用賦值運算符是允許的,用一個結構體變量初始化另一個結構體變量也是允許的。

二、數據抽象

            

                數據抽象是指,只向外界提供關鍵信息,並隱藏其後臺的實現細節,即只表現必要的信息而不呈現細節。數據抽象是一種依賴於接口和實現分離的編程(設計)技術。

                數據抽象分爲:複數運算層,複數存儲表示層。

                這兩個稱爲抽象層,表示層在下,從底層往上層來看,複數越來越抽象了,把所有這些層組合在一起就是一個完整的系統。組合使得系統可以任意複雜,而抽象使得系統的複雜性是可以控制的,任何改動都只侷限在某一層,而不會波以及整個系統。

三、數據類型標誌

            

enum coordinate_type{RECTANGULAR, POLAR};
struct complex_struct{
       enum coordinate_type t;
       double a,b;  
};

        enum關鍵字的作用和struct關鍵字類似,把coordinate_type這個標識符定義爲一個標籤,struct complex_struct表示一個結構類型,而enum coordinate_type 表示一個枚舉類型。枚舉類型的成員常量,它們的值由編譯器自動分配,例如,定義了上面的枚舉類型之後,RECTANGULAR就表示常量0,POLAR表示常量1。

四、嵌套結構體

            結構體也是一種遞歸定義:結構體的成員具有某種數據類型,而結構體本身也是一種數據類型。換句話說,結構體的成員可以是另一個結構體,即結構體可以嵌套定義。

            例如,我們在複數的基礎上定義複平面上的線段:

    

struct segment{
     struct complex_struct start;
     struct complex_struct end; 
};

            初始化也可以嵌套,因此嵌套結構體可以嵌套地初始化,例如:

struct segment s={{1.0,2.0},{4.0,6.0}};

            也可以平坦(Flat)地初始化。例如:

struct segment s={1.0,2.0,4.0,6.0};

            甚至可以把兩種方式混合使用(這樣可讀性很差,應該避免):

struct segment s={{1.0,2.0},4.0,6.0};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章