C 语言中的结构体(数据结构)
目錄
- 前言
- 結(jié)構(gòu)體和數(shù)組的區(qū)別
- 結(jié)構(gòu)體的聲明
- 方式一(不帶 tag)
- 方式二(帶 tag)
- 關(guān)于 typedef
- typedef 在結(jié)構(gòu)體的使用
- 結(jié)構(gòu)成員的訪問(wèn)
前言
結(jié)構(gòu)體是在數(shù)據(jù)結(jié)構(gòu)中經(jīng)常使用的一類(lèi),下面對(duì)結(jié)構(gòu)體進(jìn)行一些知識(shí)的補(bǔ)充。
結(jié)構(gòu)體和數(shù)組的區(qū)別
結(jié)構(gòu)體的聲明
結(jié)構(gòu)體聲明的基本形式
struct tag {member-list }variable-list;參數(shù)解釋
在結(jié)構(gòu)體聲明的時(shí)候,我們常會(huì)看到下面兩種聲明的方式
方式一(不帶 tag)
struct {int age;char sex; }man;大多數(shù)初學(xué)者看到這一長(zhǎng)串的時(shí)候會(huì)發(fā)昏,這樣的聲明形式和一般的 int a 的形式有什么關(guān)聯(lián)呢?
方式二(帶 tag)
struct people{int age;char sex; };struct people man1 , man2;我們可以看到方式二的好處就是減少了變量聲明的冗余。如果像方式一那樣,你在另一個(gè)地方要聲明一個(gè)相同的變量,就必須把前面的成員列表那一大部分也帶上。
struct peple 作為整體相當(dāng)于數(shù)據(jù)類(lèi)型的名字,也就是說(shuō) struct people 和 int,float 是同一級(jí)別的概念。
同時(shí)使用方法一還會(huì)存在下面這個(gè)問(wèn)題
struct {int age;char sex; }man1;struct{int age;char sex; }man2;man1 = man2; // 報(bào)錯(cuò)雖然 man1 和 man2 是一樣的結(jié)構(gòu)體類(lèi)型,但是編譯器會(huì)認(rèn)為是不同的類(lèi)型。
但如果用方式二就不會(huì)報(bào)錯(cuò)
struct people{int age;char sex; };struct people man1 , man2; // 或者為了好理解,也可以是 // struct people xiaozhang , xiaoli; struct people man3;man1 = man3; // 這樣就正確關(guān)于 typedef
typedef 也是在數(shù)據(jù)結(jié)構(gòu)中常用的 C 語(yǔ)言的東西。它的英文翻譯是 “類(lèi)型定義”。下面就來(lái)看看它的用法。
我更喜歡叫 typedef 為語(yǔ)義化,因?yàn)楹艽蟪潭壬鲜褂?typedef 是為了語(yǔ)義化,是需要結(jié)合現(xiàn)實(shí)世界的。
typedef int Money這句代碼的意思就是,從今往后,Money 就可以代表 int 使用了。
Money money ; // 此時(shí) money 就是 int 類(lèi)型,等價(jià)于 int money;至于為什么使用 typedef 這樣的方式,個(gè)人最大的感受就是語(yǔ)義化吧,當(dāng)然 typedef 為什么要使用的其他原因可以自行谷歌。
typedef 在結(jié)構(gòu)體的使用
先來(lái)看看這段代碼
typedef struct people {int age;char sex; } chinese;很多人會(huì)和結(jié)構(gòu)體的聲明弄混,其實(shí)不是,我用圖例來(lái)解釋就清楚了(對(duì)比結(jié)構(gòu)體聲明的圖例,觀察二者的區(qū)別)
其中,people 表示的是結(jié)構(gòu)體的名字,正如前面所說(shuō),struct people 同 int,bool 這些是同一級(jí)別的概念。
當(dāng)然,用 typedef 的時(shí)候,你也可以省略結(jié)構(gòu)的標(biāo)簽,所以你有時(shí)還會(huì)看到下面的寫(xiě)法
typedef struct {int age;char sex; } chinese;下面來(lái)看看數(shù)據(jù)結(jié)構(gòu)單鏈表里面比較難理解的對(duì)單鏈表如何去定義
typedef struct Node_1 {int data;struct Node_1 *next; }Node_2;typedef struct Node_1 *linkList;// 通常代碼會(huì)把 Node_1 和 Node_2 都寫(xiě)成一樣的 Node,具體的原因我也不是很清楚, // 有知道的同學(xué)可以在下面留言 // 但是僅就代碼而言 Node_1 表示的是結(jié)構(gòu)體的名稱,而 Node_2 表示的是代替簡(jiǎn)寫(xiě) // struct Node_1 的名稱。// 特別的是 struct Node_1 定義的是一個(gè)單獨(dú)的結(jié)點(diǎn),所以我們看到 struct Node_1 // *next; 其本意是只該結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn) // 而 typedef struct Node_1 *linkList; 表示的是一個(gè)結(jié)構(gòu)體指針,有了指針,我們就 // 可以通過(guò) malloc 函數(shù)將一個(gè)單獨(dú)的結(jié)點(diǎn)擴(kuò)充成一個(gè)鏈表了。// 所以我們?cè)诙x *linkList 的時(shí)候,typedef Node_2 *linkList; 和 // typedef struct Node_1 *linkList; 都是正確的。結(jié)構(gòu)成員的訪問(wèn)
主代碼
struct people{int age;char sex; };struct people man1 , man2,man3,*man4;
一個(gè)訪問(wèn) typedef 定義的結(jié)構(gòu)體的示例
圖解
總結(jié)
以上是生活随笔為你收集整理的C 语言中的结构体(数据结构)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机基础知识教程word表格,[电脑基
- 下一篇: python的scipy库无法使用_sc