結構體是一些值的集合,這些值稱為成員變數。每個成員可以是不同型別的變數。
結構體所佔記憶體大小為其成員所佔記憶體之和。空結構體所佔記憶體大小為1位元組。
柔性陣列,結構體最後乙個成員允許是未知大小的陣列,用malloc函式進行動態記憶體分配。
結構體的宣告:
//例如描述乙個學生:
struct stu
;//特殊的宣告:在宣告結構的時候可以不完全的宣告
//例如:匿名的結構體型別
struct
x;//結構體的成員可以是標量、陣列、指標,甚至是其他結構體。
//結構體成員的訪問:結構體變數的成員是通過點操作符(.)訪問的。點操作符接受兩個運算元。
struct stu s;//定義結構體變數
s.age=20;//對成員進行定義
//結構體訪問指向變數的成員,當乙個結構體變數為指標變數時,如何訪問?
struct stu *ps;
//兩種方式:
(*ps).age=10;
ps->age=10;
5.結構的自引用:
//結構體的自引用一定通過指標
typedef struct node
node;
6 結構的不完整宣告
struct a
;struct b
;//上述為不完整的宣告,不知道a與b誰先放在前面,以下為解決方案
struct b;
struct a
;struct b
;
7 結構體變數的定義和初始化
struct point
p1; //宣告的同時定義了變數p1
struct point p2; //定義結構體變數p2
struct point p3=;//定義的同時可以賦值
//結構體的巢狀初始化
struct node
n1=,null};
struct node n2=,null};
8.結構體的記憶體對齊
struct s1
;printf("%d\n",sizeof(struct s1));//取最大對齊數的整數倍為12
struct s2
;printf("%d\n",sizeof(struct s1));//取最大對齊數的整數倍為8
struct s3
;printf("%d\n",sizeof(struct s1));//取最大對齊數的整數倍為16
//結構體巢狀
struct s4
;printf("%d\n",sizeof(struct s1));//取最大對齊數的整數倍為32
結構體傳參
struct s
;struct s s=,1000};
//結構體傳參
void print1(struct s s)
//結構體位址傳參
void print2(struct s* ps)
int main()
位段的宣告和結構體類似,有兩個不同:
位段的成員必須是:int、unsigned int 、signed int或是char(屬於整型家族)型別。
位段的成員名後面有乙個冒號和乙個數字。
例如:
struct a
;//該位段型別的大小是多少?
printf("%d\n",sizeof(struct a)); //8
//如何計算的呢?
//2+5+10+30=47(bit)=6位元組
//該位段對齊數為4位元組,因此大小應為4的倍數,因此結果為8。
4.總結:
###列舉型別
將可能的取值一一枚舉,可能的取值都是有值的,預設從0開始,一次遞增1,也可以在定義的時候賦初值。
例如:
//定義顏色
enum color
;//型別重新命名
typedef enum ***
***;
//賦初值
enum color
###聯合(共用體)
聯合是一種特殊的自定義型別,這種型別定義的變數包含的一系列成員共用同一塊記憶體空間,這樣聯合的大小至少是最大成員的大小(注意:當最大成員的大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍)。
例如:
//聯合體的宣告
union un
;//聯合體的定義
union un un;
//計算連個變數的大小
printf("%d\n",sizeof(un));//4
printf("%d\n", &(un.i));//3014152
printf("%d\n", &(un.c));//3014152
//共用一塊空間,位址相同
un.i = 0x11223344;
un.c = 0x55;
printf("%x\n", un.i);//11223355
//由於共用乙個空間,所以i會因c發生改變。
//由聯合體的特點可以用聯合體判斷大小端
int check_sys()
un; un.i=1;
return un.c;//c可以代表i的前乙個位元組的位址。
}
c語言 自定義型別 結構體,位段,列舉,聯合
1.結構體的宣告 陣列是一組相同型別元素的集合,當我們想將不同的不同型別的元素組成乙個集合時,則可以用結構體來宣告。比如,我們想宣告乙個學生的資訊集合 struct student 記得一定要有分號喲!這時乙個新的型別產生了,名字就叫做 struct student。其中student是可以省略的,...
自定義型別 結構體 位段 列舉 聯合
include include include 1 結構體 結構是一些值的集合,這些值稱為結構體成員,結構體的每個成員可以是不同型別的變數 struct stu 結構體的自引用 struct node 錯誤的,結構體內不能包含結構體自身 struct node 正確 指標是四個位元組 結構體內存對齊...
自定義型別 結構體 位段 列舉 聯合
1 結構體基礎知識 定義 不同或相同型別元素的集合 宣告 直接上例子會更清楚 成員 可以是變數 陣列 指標甚至其它結構體成員。struct stu 分號不能丟特殊宣告 匿名結構體型別,並不建議省略結構體型別名,知道有這麼回事就好了 struct x 注意 有n個結構體就有n種型別,即使兩個結構體成員...