複習關於C的結構體struct

2021-07-28 13:29:58 字數 2528 閱讀 9257

今天見到乙個結構體函式指標,有些迷糊,在自己複習和整理一下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...