首页
/
每日頭條
/
生活
/
簡述結構體的定義與使用
簡述結構體的定義與使用
更新时间:2025-09-14 12:12:31

本篇文章主要是對結構體數據類型的一個知識擴展,包含了結構體的嵌套使用、結構體數組、結構體指針。

簡述結構體的定義與使用(構造類型結構體的知識擴展)1

1. 構造體的嵌套使用

在學習結構體時,有提到結構體裡面的成員可以是基本數據類型,也可以是數組、結構體等其他類型。

那麼,接下來就說一下,在定義結構體中嵌套另一個結構體的兩種方法。

第一種方法:獨立結構嵌套。

分别定義了兩個結構,然後将其中一個結構嵌套在另一個結構中。

struct Birthday{ int dd; int mm; int yy; }; struct Student{ char *name; struct Birthday birthday; };

這裡需要注意兩個點:

A. 嵌套的結構體(Birthday)必須要在被嵌套的結構體(Student)之前定義,如果順序反了,編譯器是不會通過的,會給出如下報錯。

error: field 'birthday' has incomplete type

錯誤:字段'birthday'的類型是不完整的

這是因為C語言程序的編譯是自上而下執行的。

如果兩個結構體的順序寫反了,編譯器首先是執行到 Student 結構,看到裡面的 Birthday 結構聲明的變量,因為結構體是程序員自定義的數據類型,系統是不提供的,而這裡的 Birthday 結構還沒有進行定義,所以C語言是不認識這種數據類型,就會給出報錯。

B. 在定義結構中嵌套另一個結構,如果沒有定義結構的别名,struct 和結構名稱必須同時出現,才表示為結構體類型。

同時在結構體中,一個完整的成員必須包含類型以及變量名,缺一不可。

第二種方法:嵌入式嵌套

這種方式就不用考慮兩個獨立結構誰先誰後的問題,隻需要在被嵌套的結構(Student)中以嵌入的方式定義嵌套的結構(Birthday)類型。

struct Student{ char *name; struct Birthday{ int dd; int mm; int yy; } birthday; };

和前面的獨立結構嵌套相比,如果嵌套的結構體比較少,可以采用這種方式。但是要嵌套好幾個結構體,建議還是使用獨立嵌套的方式,否則會導緻代碼看上比較冗長複雜。

嵌套結構體的初始化和訪問方式如下:

// 變量初始化 Struct Student s1 = {"張三", {1,1, 2000}}; // 訪問 Birthday 結構中 dd 成員; s1.birthday.dd; // 1

關于結構體嵌套,還有一個非常重要的問題:所定義的結構體能将自身類型作為成員嗎?

struct A{ struct A a; } aa;

答案是不能的,像上面這種寫法是錯誤的。

嵌套的是定義結構自身的變量,就會出現這種情況:aa.a.a.a.a.a.a……就會一直無限循環下去。

在内存分配的時候,由于無法确定所定義的結構體地長度,就不會被系統允許。

但是如果想要引用自身,也不是不行,可以通過指針來進行使用。

指針類型,無論是什麼類型的指針,所占的内存大小都是固定的。

struct A{ struct A *a; } aa;

2. 結構體指針

結構體的指針類型的聲明方式如下:

struct 結構名稱 *變量名;

結構體的指針聲明和基本數據類型是一樣,都需要帶上尋址運算符(&)。

struct Student{ char *name; int age; }; struct Student s1 = {"張三", 15}; struct Student *ps1 = &s1;

通過指針類型訪問結構體中的成員的方式有兩種。

第一種,通過訪問運算符。

(*ps1).name; // 張三

由于訪問運算符的優先級比較高,所以需要對 *ps1 添加上括号。

如果沒有加上括号,先執行的是 ps1.name,而 ps1 是一個指針變量,所存儲的是結構體 s1 的内存地址。

第二種方式,通過箭頭運算符 -> 進行訪問。

箭頭運算符是C語言結構體的一種特殊的運算符,可以直接從結構體指針變量中訪問結構體裡面的成員。

ps1->age; // 15

3. 結構體數組

數組,是用來存儲相同類型的集合。

結構體數組,用來存儲同一個結構類型的不同數據,也叫作結構的集合。

例如,定義了一個學生的結構,而一個班裡面又有很多個學生。總不能一個一個地去聲明不同數據的學生結構類型,這樣做就是顯得太麻煩了。

這時候,我們就可以用一個數組變量來存儲起來。

結構體數組的定義方式如下:

struct Student{ char *name; int age; } class[5] = { {"孫悟空", 500}; {"唐僧", 33}; {"豬八戒", 101}; {"沙僧", 98}; {"白龍馬", 102}; };

定義的結構體數組變量 class 中括号裡面的數字,如果有進行初始化操作,即數組中全部元素都已經賦值,則可以不用帶。系統會自動根據數組裡面的内容,給該數組确定相應的長度。

如果沒有進行初始化,則必須要帶上數組長度,否則就會出錯。

結構體數組的訪問方式也比較簡單,通過數組索引值取出相應的結構,再通過訪問運算符進行訪問。

例如:我們想知道唐僧的年齡。

class[1].age; // 33

總結

以上就是關于構造數據類型,結構體的知識擴展内容,包括了嵌套使用、結構體指針以及結構體數組的知識。

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
吃完油炸食品如何補救
吃完油炸食品如何補救
1、飲用木瓜奶:木瓜是一種很好的去油膩的食物。是解油膩的一種有效食物。将木瓜和牛奶一起搭配,制作成木瓜奶,能很好的對吃完油炸食品進行補救。2、吃水果:水果中富含維生素C,還有其他的很多天然營養物質,如:蘋果中的果膠、纖維索,葡萄中的白黎蘆醇,它們具有很好的降脂作用,對降低膽固醇和抑制膽固醇合成酶的活性有很好的效用。在吃完油炸食品後,通過食用水果,能很好地解除油膩,對預防脂肪堆積有很好的幫助。3、喝
2025-09-14
芭比娃娃的書包怎麼做
芭比娃娃的書包怎麼做
第一、準備紙、彩筆、剪刀、膠棒。第二、先用剪刀在紙上裁下兩個小紙條,當作書包帶。第三、把長方形兩邊抹上膠棒,粘在一起,圍成一個圓柱。第四、把圓柱拍扁,接口處在中間。第五、把上下兩條邊向中間折一小段。第六、把上下兩邊打開,把兩側的角往中間按平。第七、再把每個小角上下兩邊往中間折,一層壓一層疊好。第八、...
2025-09-14
如何除鏽最快
如何除鏽最快
1、使用白醋,白醋能與金屬上的鏽起化學反應将之分解,可以把金屬浸泡在白醋裡數幾個小時,然後把鏽層擦掉即可。2、使用酸橙和鹽,将鹽撒在生鏽面上将其徹底的覆蓋,然後将酸橙榨汁倒在上面。再使用酸橙的外皮把混合物擦掉,酸橙皮足以去除鏽層。
2025-09-14
孔雀魚生小魚怎麼養
孔雀魚生小魚怎麼養
1、如果孔雀魚生出小魚之後,就需要将成魚和小魚分開飼養,不然的話小魚可能會被大魚吃掉。2、要保證養殖環境,水環境對于魚來說至關重要。所以說,即便是分開來飼養成年孔雀魚和小孔雀魚,也最好使用原魚缸中的水來養。3、母魚喂養過程中需要加強營養,最好喂點活食,如水蚤等。而小魚第二天開始就可以喂蛋黃水,注意一...
2025-09-14
怎麼做簡易錦囊袋
怎麼做簡易錦囊袋
1、剪好正方形布料(9厘米的正方形布一塊,棉花少許)。2、對角折好後,縫合,留返口。3、塞棉,縫合。...
2025-09-14
Copyright 2023-2025 - www.tftnews.com All Rights Reserved