C語言中的結構體

2021-07-02 20:39:43 字數 3504 閱讀 8280

c語言中,結構體(struct)指的是一種資料結構,是c語言中聚合資料型別(aggregate data type)的一類。結構體可以被宣告為

變數、指標或

陣列等,用以實現較複雜的

資料結構。結構體同時也是一些元素的集合,這些元素稱為結構體的成員(member),且這些成員可以為不同的型別,成員一般用名字訪問。

[1]結構體的定義如下所示,struct為結構體關鍵字,tag為結構體的標誌,member-list為結構體成員列表,其必須列出其所有成員;variable-list為此結構體宣告的變數。

[1] 1

2

3

structtag  variable-list ;

在一般情況下,tag、member-list、variable-list這3部分至少要出現2個。以下為示例:

[1] 1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

//此宣告宣告了擁有3個成員的結構體,分別為整型的a,字元型的b和雙精度的c

//同時又宣告了結構體變數s1

//這個結構體並沒有標明其標籤

structs1;

//同上宣告了擁有3個成員的結構體,分別為整型的a,字元型的b和雙精度的c

//結構體的標籤被命名為******,沒有宣告變數

struct******;

//用******標籤的結構體,另外宣告了變數t1、t2、t3

struct****** t1, t2[20], *t3;

//也可以用typedef建立新型別

typedefstruct******2;

//現在可以用******2作為型別宣告新的結構體變數

******2 u1, u2[20], *u3;

在上面的宣告中,第乙個和第二宣告被編譯器當作兩個完全不同的型別,即使他們的成員列表是一樣的,如果令t3=&s1,則是非法的。

[1]結構體的成員可以包含其他結構體,也可以包含指向自己結構體型別的

指標,而通常這種

指標的應用是為了實現一些更高階的資料結構如鍊表和樹等。

[1] 1

2

3

4

5

6

7

8

9

10

//此結構體的宣告包含了其他的結構體

structcomplex;

//此結構體的宣告包含了指向自己型別的指標

structnode;

如果兩個結構體互相包含,則需要對其中乙個結構體進行不完整宣告,如下所示:

[1] 1

2

3

4

5

6

7

8

9

10

11

structb;

//對結構體b進行不完整宣告

//結構體a中包含指向結構體b的指標

structa;

//結構體b中包含指向結構體a的指標,在a宣告完後,b也隨之進行宣告

structb;

結構體和其他型別基礎

資料型別一樣,例如int型別,char型別 只不過結構體可以做成你想要的資料型別。以方便日後的使用。

[1]在實際專案中,結構體是大量存在的。研發人員常使用結構體來

封裝一些屬性來組成新的型別。由於c語言內部程式比較簡單,研發人員通常使用結構體創造新的「屬性」,其目的是簡化運算。

[1]結構體在

函式中的作用不是簡便,其最主要的作用就是封裝。封裝的好處就是可以再次利用。讓使用者不必關心這個是什麼,只要根據定義使用就可以了。

[1]結構體的大小不是結構體元素單純相加就行的,因為我們主流的計算機使用的都是32bit

字長的cpu,對這型別的cpu取4個

位元組的數要比取乙個位元組要高效,也更方便。所以在結構體中每個成員的首位址都是4的整數倍的話,取資料元素時就會相對更高效,這就是記憶體對齊的由來。每個特定平台上的

編譯器都有自己的預設「對齊係數」(也叫對齊模數)。程式設計師可以通過

預編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一係數,其中的n就是你要指定的「對齊係數」。

[1]規則:

1、 資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員的對齊按照#pragma pack指定的數值和這個資料成員自身長度中,比較小的那個進行。

[1]2、結構(或聯合)的整體對齊規則:在

資料成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行。

[1]3、結合1、2可推斷:當#pragma pack的n值等於或超過所有資料成員長度的時候,這個n值的大小將不產生任何效果。

C語言中結構體

struct oursvoid main struct ours o2 01 結構體整體直接賦值的時候,即使字串也可以直接賦值 o1.str o2.str 錯誤,字串不能直接賦值 字串拷貝的方式 sprintf o1.str,02.str strcpy o1.str,o2.str 3.1 第一種情況...

c語言中的結構體

定義結構體變數 結構體 自定義的一種型別稱為構造型別,在c語言中稱為結構體 定義結構體 struct 結構體名 定義結構體變數 1.struct 結構體名 變數名 引用結構體成員 運算子.結構體變數.成員 定義結構體變數並初始化 struct 結構體名 變數名 結構體與陣列類似,定義之後不能直接整體...

C語言中的結構體。

這篇部落格我想將一下c語言中的結構體。對於結構體的概念性問題這裡博主不再過多闡述,我們還是用 說話。結構體的語法 這是c語言中的規則 struct 結構體名 我們可以寫乙個簡單的結構體 struct student 在這裡我們要明白乙個事情,c語言中結構體成員變數一般來說應該從定義的由大至小存放,比...