C語言結構體的學習與使用

2021-10-08 06:59:48 字數 3197 閱讀 6647

結構體是c語言中的明顯的構造型別,相對於只能儲存相同型別元素的陣列,結構體是存放不同型別資料的集合。結構體一般會在處理資料資訊時使用。

構造結構體定義,型別為 struct person

struct person

;

上述形式只是定義了乙個型別,型別中有 number、***、money這些內容。

結構體的使用,使用結構體型別定義變數

struct person p1;

// 注意 struct person 是乙個完整的型別, p1 才是結構體變數。

如果要訪問結構體成員,需要使用成員訪問運算子.

p1.number =1;

p1.*** =

'f';

p1.money =

62.5

;printf

("%d %c %lf"

, p1.number, p1.***, p1.money)

;

以上是賦值的操作,但是如果加上const則只能通過初始化的方式進行賦值。

const

struct person example_person =

;

在結構體成員初始化中,可以按照型別的格式給部分成員進行初始化,但是會按照定義的先後順序進行匹配,而不是按照型別進行匹配。

也可以通過傳參的方式進行處理

void

print_person

(struct person p)

print_person

(example_person)

;

也可以定義結構體陣列,用於存放建立的結構體,然後通過陣列的遍歷進行訪問

struct person arr=

,,};

除此之外,結構體內部也可以存放陣列和結構體。

struct date

;struct person

;

此時對內嵌結構體成員的訪問形式為p.birthday.year先單層訪問到 birthday,再訪問到 year。

這裡注意,當在結構體中定義了乙個 char 型別的陣列時,可以通過初始化為其賦值,也可以通過strcpy(p.name, "li hua")的方式進行賦值,但是不能直接使用p.name = "li hua",因為p.name是乙個陣列名,相當於乙個指標常量,固定指向這個陣列的第乙個位址,該錯誤用法的含義是向指標常量賦值,顯然是不可行的。

在結構體型別宣告時,會使用固定的struct ***形式,並且在後續的使用中都要以這樣的形式完整的出現,因此,為結構體起乙個別名,可以更加方便的使用結構體變數。

struct person

p;

這裡的 p 是乙個全域性變數,可以通過p.***的形式直接訪問成員,但是不推薦以直接定義全域性變數的形式建立結構體變數,因為全域性變數會在程式執行期間一直消耗記憶體空間。

typedef

struct person

p;

此時定義的p是乙個型別,就可以通過該型別建立變數,即結構體的別名。

p p1;
如果不需要內嵌,那麼就可以使用匿名結構體,即:

typedef

struct

p;

如果將結構體的定義放到乙個函式中,並想要在函式的外部進行使用,只能在外部重新再次定義結構體,因為結構體定義在函式內部,無法在外部獲取其定義。

此外還要注意,結構體的定義要在使用之前。

struct person

;

建立了乙個這樣的結構體後,可以使用sizeof()檢視結構體所佔記憶體的大小。

影響結構體所佔記憶體大小的主要因素有:本身成員變數的型別、結構體存在位元組對齊

結構體位元組對齊是指,如果下乙個成員無法在有限的空間內存放,則需要額外的空間,開闢的空間應是結構體內部最大的單成員變數的整數倍。例如上述結構體中,自身對齊最大的為double型別,其占用8個位元組,因此intchar就要共同占用8個位元組以保證和最大單元對齊,此時占用記憶體大小為 16 位元組,如果將結構體中的變數宣告順序調換一下

struct person

;

同樣的是與 8 位元組的double型別進行對齊,但intchar是分開的,無法再共同占用8位元組,所以此時的結構體占用的記憶體大小為24。

那麼如何優化位元組對齊呢?第一種方式是按照有限空間合理排布成員順序,第二種是通過#pragma pack(size)來更改位元組對齊的方式。

#pragma pack(1)

// 位元組對齊按照1位元組對齊,無額外空間的方式,直接等於所有位元組大小相加

// size允許的取值為1、2、4、8、16,即與實際的基礎型別位元組大小相匹配

struct person

;

位域,也是一種優化結構體占用記憶體的方式,針對於整數型別的成員變數,可以通過位域指定其所佔記憶體位的多少,但要注意,無法超越其本身的位數,例如,char型別不能超過8位。

struct person

;

定義方式:

union message

;

使用共用體型別建立變數union message m1,共用體所佔記憶體的大小只與最大的元素的大小有關,其對於共用體的大部分操作和結構體一樣。但需要注意,因為共用體只有乙個記憶體,不可以按照結構體初始化的方式對所有成員變數進行初始化。其初始化只需要對其中某乙個成員進行初始化。

列舉的定義:

enum week

;enum week w1 = mon;

列舉型別其本質還是正整數型別,可以為列舉元素指定其值的大小。

C語言結構體與結構體指標的使用

c語言結構體 struct 是由一系列具有相同型別或不同型別的資料構成的資料集合。說的通俗一點就是乙個集合。c語言是一門面向過程的程式語言,而結構體的使用在某些層次上跟物件導向有點異曲同工之處了。下面回歸正題,學習一下結構體以及結構體指標的知識。一 結構體變數的定義和初始化 1 首先我們來看一下結構...

C 語言 結構體的定義與使用

1 先定義結構體,在定義結構體變數 struct stu 定義結構體 struct stu student1 定義結構體變數 2 定義結構體同時定義結構體變數 struct stu student 還可以在定義結構體變數 struct stu student1 3 直接定義結構體型別變數 struc...

C語言結構體的定義與使用

1.結構體 存放不同資料的集合 1 結構體內可以放入結構體 typedef unsinged short ushort struct date 2 結構體內可以放入陣列 char name 20 code struct define.c 3 include includesturct person ...