在宣告結構體時,必須列出它包含的所有成員
語法結構struct tag variable-list
;
這個宣告建立名為x的變數,它包含四個成員。struct
x;
這個宣告建立名為y和z的指標變數,y是乙個陣列,它包含20個結構。z是乙個指標,指向這型別的結構。struct
y[20],
*z;
這兩個宣告是截然不同的型別
,即使他們的成員列表完全相同,因此 z = &x是非法的
/*標籤 類似於麵包形狀模板,它給定了製作出來的麵包的形狀,但是它沒有製作出麵包*/
struct ******
;
標籤標識了一種模式,用於宣告/*利用上述的標籤(麵包模板),製作出乙個麵包(****** 型別的結構體)*/
struct ****** x;
struct ****** y[20]
,*z;
未來的
變數,但是無論標籤還是模式
本身都不是變數,這個和方法1的最大區別—x,y,z是同一種型別的結構體變數
。
這個技巧和宣告乙個結構體標籤的效果幾乎相同,區別在於最常用的使用技巧typedef 建立一種新的型別
typedef
struct
******;
******現在是型別名
而不是個結構標籤,
struct ****** x;
struct ****** y[20]
,*z;
宣告結構體
struct ****** x,*z;
//宣告乙個 結構體變數x,和乙個指向結構體變數的指標。
訪問變數x的結構體成員
x.a;
x.b;
x.c;
訪問指標z
z->a;
z->b;
z->c;
結構體的自引用就是在乙個結構體內部包含這個結構體本身。
這個方法是struct selp_ref1
//非法
非法
的,成員b是另乙個完整的結構體,其內部還將包含它自己的成員b.
第二個成員又是另外乙個完整的結構體,它還包含自己的成員b。這樣永無止境迴圈。
區別在於b現在是乙個指標不是乙個結構體,編譯器在結構的長度確定之前就知道指標的長度,所以這種型別的自引用是合法的。struct selp_ref1
//合法
如果你覺得乙個結構內部包含乙個指向該結構體本身的指標有些奇怪,請記住它事實上指向的是同一種型別的不同結構體。更加高階的資料結構,如鍊表和樹,都是使用這種技巧實現的每個結構指向鍊錶的下乙個元素或樹的下乙個分支。
這個宣告的目的是為這個結構體建立型別名 selp_ref3。但是,typedef
struct
selp_ref3;
它失敗了
。
型別名直到宣告的末尾才定義,所以在結構宣告的內部它尚未定義。
解決方案是定義乙個結構體標籤來宣告b,
聯合體可以被初始化,但這個初始化必須是typedef
struct selp_ref3_tag selp_ref3;
第乙個成員
的型別,而且它必須位於乙個花括
號內
union
x =;
把 x.a 初始化為5。
我們不能把這個初始化的類量初始化為 字元型,浮點型,只能是第乙個成員的型別。如果被初始化為其他型別,則進行強制轉換(如果可以轉換),再賦值給x.a。
本文參考《c和指標》這個本書寫的。
struct結構體的變數宣告加冒號
有些資訊在儲存時,並不需要占用乙個完整的位元組如協議包頭,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區域,並說明每個...
什麼結構體 struct
簡單的來說,結構體就是乙個可以包含不同資料型別的乙個結構,它是一種可以自己定義的資料型別,它的特點和陣列主要有兩點不同,首先結構體可以在乙個結構中宣告不同的資料型別,第二相同結構的結構體變數是可以相互賦值的,而陣列是做不到的,因為陣列是單一資料型別的資料集合,它本身不是資料型別 而結構體是 陣列名稱...
定義結構體 struct
於 鏈結,struct student struct student stu struct student stuarray 10 struct student pstru 結構體型別是struct student,因此,struct和student都不能省略。但實際上,我用codeblocks執行...