今天見到乙個結構體函式指標,有些迷糊,在自己複習和整理一下c的結構體(struct)知識。其中大部分內容**於網路。
基本定義:結構體,通俗講就像是打包封裝,把一些有共同特徵的變數封裝在內部,通過一定方法訪問修改內部變數。說明和使用之前必須先定義它,也就是構造它。如同在說明和呼叫函式之前要先定義一樣。
結構體定義:
第一種:只有結構體定義
struct
student
; //注意在括號後的分號是必不可少的。
第二種:只有結構體定義
struct
student
liuduhua;
第二中等同於第一種定義後在:
struct
student liuduhua;
結構體成員變數的訪問除了可以借助符號".",還可以用"->"訪問,比如:
liuduhua.num = 1;liuduhua->float = 98.5;
對齊方式
編輯
各 成員變數在存放的時候根據在結構中出現的順序依次申請空間,同時按照上面的對齊方式調整位置,空缺的
位元組vc會自動填充。同時vc為了確保結構的大小為結構的位元組邊界數(即該結構中占用最大空間的型別所占用的位元組數)的倍數,所以在為最後乙個成員變數申請空間後,還會根據需要自動填充空缺的位元組。
struct
student
liuduhua;
sizeof(
student) == 28;
struct
student
liuduhua;
sizeof(
student
) == 32
#pragma pack(2)
struct student
liuduhua;
sizeof(
student
) == 28
#pragma pack(1)
struct student
liuduhua;
sizeof(
student) == 27
c中提供了
#pragma
pack(n)來設定變數以n
位元組對齊
方式。n位元組對齊就是說變數存放的起始位址的
偏移量有兩種情況:第
一、如果n大於等於該變數所占用的位元組數,那麼偏移量必須滿足預設的對齊方式,第
二、如果n小於該變數的型別所占用的位元組數,那麼偏移量為n的倍數,不用滿足預設的對齊方式。結構的總大小也有個約束條件,分下面兩種情況:如果n大於所有
成員變數
型別所占用的位元組數,那麼結構的總大小必須為占用空間最大的變數占用的空間數的倍數;
#pragmapack(push) //儲存對齊狀態
#pragma pack(1) //設定為1位元組對齊
#pragma
pack(pop)//恢復對齊狀態
struct和typedef struct
typedef struct student
stu;
於是在宣告變數的時候就可:stu stu1;(
如果沒有typedef就必須用struct student stu1;來宣告)
這裡的stu實際上就是struct student的別名。stu==struct student
另外這裡也可以不寫student(於是也不能struct student stu1;了,必須是stu stu1;)
typedef struct
stu;
但在c++裡很簡單,直接
struct student
;
於是就定義了結構體型別student,宣告變數時直接student stu2;
在c++中如果用typedef的話,又會造成區別:
struct student
stu1;//
stu1是乙個變數
typedef struct student2
stu2;
//stu2是乙個結構體型別=struct student
使用時可以直接訪問stu1.a
但是stu2則必須先 stu2 s2;
然後 s2.a=10;
關於c 的結構體struct與class的區別
c 結構體 struct c 中結構型別和類型別在語法上非常相似,他們都是一種資料結構,都可以包括資料成員和方法成員。結構和類的區別 1 結構是值型別,它在棧中分配空間 而類是引用型別,它在堆中分配空間,棧中儲存的只是引用。2 結構型別直接儲存成員資料,讓其他類的資料位於對中,位於棧中的變數儲存的是...
C 結構體 struct 詳解
陣列 array 它是一組具有相同型別的資料的集合。但在實際的程式設計過程中,我們往往還需要一組型別不同的資料,例如對於學生資訊登記表,姓名為字串,學號為整數,年齡為整數,所在的學習小組為字元,成績為小數,因為資料型別不同,顯然不能用乙個陣列來存放。在c語言中,可以使用 結構體 struct 來存放...
C語言結構體struct
定義 定義結構體,要定義兩次,1定義型別,2定義變數 1定義時 不分配記憶體,和 define一樣 定義結構體的樣式,叫什麼名字,成員,句式 2再定義 分配記憶體 用著個樣式定義變數 與typedef有點像 3如果定義的是 p指標,只表示出此結構體 變數的起始位址 struct a struct a...