struct结构体的多种声明方式
結構體聲明
方法1
在聲明結構體時,必須列出它包含的所有成員
語法結構 struct tag { member-list} variable-list;
這個聲明創建名為X的變量,它包含四個成員。
struct {int a ;float b;double c;short d;}y[20],*z;
這個聲明創建名為y和Z的指針變量,y是一個數組,它包含20個結構。Z是一個指針,指向這類型的結構。
這兩個聲明是截然不同的類型,即使他們的成員列表完全相同,因此 z = &x是非法的
方法2
/*標簽 類似于面包形狀模板,它給定了制作出來的面包的形狀,但是它沒有制作出面包*/ struct SIMPLE {int a ;float b;double c;short d;}; /*利用上述的標簽(面包模板),制作出一個面包(SIMPLE 類型的結構體)*/ struct SIMPLE x; struct SIMPLE y[20],*z;標簽標識了一種模式,用于聲明未來的變量,但是無論標簽還是模式
本身都不是變量,這個和方法1的最大區別—x,y,z是同一種類型的結構體變量。
方法3
最常用的使用技巧typedef 創建一種新的類型 typedef struct{int a;char b;float c;} Simple;這個技巧和聲明一個結構體標簽的效果幾乎相同,區別在于Simple現在是類型名
而不是個結構標簽,
結構體的訪問
聲明結構體 struct Simple x,*z; //聲明一個 結構體變量x,和一個指向結構體變量的指針。訪問變量x的結構體成員 x.a; x.b; x.c;訪問指針Z z->a; z->b; z->c;結構體的自引用
結構體的自引用就是在一個結構體內部包含這個結構體本身。 struct SELP_REF1{int a;struct SELP_REF1 b;int c; } //非法這個方法是非法的,成員b是另一個完整的結構體,其內部還將包含它自己的成員b.
第二個成員又是另外一個完整的結構體,它還包含自己的成員b。這樣永無止境循環。
區別在于b現在是一個指針不是一個結構體,編譯器在結構的長度確定之前就知道指針的長度,所以這種類型的自引用是合法的。
如果你覺得一個結構內部包含一個指向該結構體本身的指針有些奇怪,請記住它事實上指向的是同一種類型的不同結構體。更加高級的數據結構,如鏈表和樹,都是使用這種技巧實現的每個結構指向鏈表的下一個元素或樹的下一個分支。
警告
typedef struct {int a;SELP_REF3 *b;int c; }SELP_REF3;這個聲明的目的是為這個結構體創建類型名 SELP_REF3。但是,它失敗了。
類型名直到聲明的末尾才定義,所以在結構聲明的內部它尚未定義。
解決方案是定義一個結構體標簽來聲明b,
typedef struct SELP_REF3_TAG {int a;struct SELP_REF3_TAG *b;int c; }SELP_REF3;聯合體的初始化
聯合體可以被初始化,但這個初始化必須是第一個成員的類型,而且它必須位于一個花括號內
union {int a;char b;float c[5]; }x = {5}; 把 x.a 初始化為5。我們不能把這個初始化的類量初始化為 字符型,浮點型,只能是第一個成員的類型。如果被初始化為其他類型,則進行強制轉換(如果可以轉換),再賦值給x.a。
本文參考《C和指針》這個本書寫的。
總結
以上是生活随笔為你收集整理的struct结构体的多种声明方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言-struct 结构体变量的内存分
- 下一篇: MapStruct Documentat