自定義型別(結構體 位段 列舉和聯合)

2021-08-11 03:26:45 字數 1486 閱讀 1805

結構體常用於資料的大體模板相同,但具體的內容不同。例如:學生的資訊都包括學號,姓名,年齡等資訊,但是每個學生的資訊的內容不同。這時就要用到結構體的建立。

1.定義結構體變數(以學生資訊為例)

struct stu

student;

也可以用struct stu student;來定義結構體變數。

當然也可以用

typedef struct stu ;

這時就建立了乙個新的結構體變數stu,應用這種方法可以實現簡便的結構體變數的定義。stu student;來定義結構體的變數。

在這裡有幾種常見的較難理解的結構體建立

(1)自引用

struct stu

student;

這種型別簡單來看就是構成了乙個鍊錶,訪問student,訪問到指標,在此跳轉到student結構體的頭,以此往復,構成鍊錶。

(2)結構體的不完整宣告

struct a ;

struct b ;

在宣告結構體時,記憶體會給結構體建立記憶體空間,這時就會計算結構體的大小,而按照上述的建立,a的結構體因為包含有b的結構體型別的指標,所以在計算a的大小時,就要訪問b,計算b的大小,但是b又要計算a的大小,這就相當於無限次的遞迴,卻沒有遞迴出口。所以就會顯示錯誤。所以在建立時,可以在a之前對結構體b進行宣告。

2.結構體的初始化

可以整體進行賦值語句,例如struct stu student =;

而在上述建立中提到的含有指標的結構體的初始化可以使用結構體巢狀初始化,例如struct a p=,null};

3.結構體內存對齊

這裡給大家講乙個較為典型的例子。(以visual stdio 2013為例,預設的對齊數為8)

struct s1

//80

4.位段

struct a ;

形如以上型別的便是位段,位段是針對於位元位而言的,冒號之後的就是相應要使用的位元位,以上例為例:求其大小:第乙個int 型別有32位位元位,a使用2個位元位,b使用5個位元位,c使用10個位元位,這時第乙個int型還剩下15個位元位,而d需要30個位元位,明顯位元位不夠,所以要再開闢乙個int大小的32位位元位,再這裡要特別注意,當位元位不夠時,新的位元位要從新的int 來開始,這是和記憶體的儲存資料的方式有關。所以該位段的大小為2.

5.列舉

enum color ;

使用列舉型別時,將enum color clr=green;在這裡列舉就相當於乙個新的color型別,對其進行賦值,在這裡需要注意的是如果沒有對齊列舉中的內容賦值時,輸出的值就為前乙個的值加1,所以此時若輸出列舉內容相應的取值,輸出red=1,green=2;blue=3; 

6.聯合

union un

union un u;

在這裡需要注意的是,可以將聯合體看做乙個變數,但是只能訪問乙個值,也就相當於訪問首位址。

所以,如果你列印i和c的位址的話,會發現兩者的位址相同。

特別注意聯合體的對齊方式,以上邊的例子為例,看注釋。

自定義型別 結構體 位段 列舉 聯合

include include include 1 結構體 結構是一些值的集合,這些值稱為結構體成員,結構體的每個成員可以是不同型別的變數 struct stu 結構體的自引用 struct node 錯誤的,結構體內不能包含結構體自身 struct node 正確 指標是四個位元組 結構體內存對齊...

自定義型別 結構體 位段 列舉 聯合

1 結構體基礎知識 定義 不同或相同型別元素的集合 宣告 直接上例子會更清楚 成員 可以是變數 陣列 指標甚至其它結構體成員。struct stu 分號不能丟特殊宣告 匿名結構體型別,並不建議省略結構體型別名,知道有這麼回事就好了 struct x 注意 有n個結構體就有n種型別,即使兩個結構體成員...

自定義型別詳解(結構體,位段,列舉, 聯合)

1.1 結構體宣告 結構體是一些值的集合,這些值稱為成員變數,這些值可以是不同的型別 struct tag variable list include include 結構體是一些值的集合,這些值稱為成員變數,結構的每個成員可以是不同型別的變數。一般宣告 struct stu 特殊宣告 匿名結構體型...