日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

C 语言中的结构体(数据结构)

發(fā)布時(shí)間:2024/8/1 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C 语言中的结构体(数据结构) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 前言
  • 結(jié)構(gòu)體和數(shù)組的區(qū)別
  • 結(jié)構(gòu)體的聲明
    • 方式一(不帶 tag)
    • 方式二(帶 tag)
  • 關(guān)于 typedef
    • typedef 在結(jié)構(gòu)體的使用
  • 結(jié)構(gòu)成員的訪問

前言

結(jié)構(gòu)體是在數(shù)據(jù)結(jié)構(gòu)中經(jīng)常使用的一類,下面對(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ù)解釋

  • tag:結(jié)構(gòu)體的名字
  • member-list:成員列表
  • variable-list:變量列表
  • 在結(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ù)類型的名字,也就是說 struct people 和 int,float 是同一級(jí)別的概念。

    同時(shí)使用方法一還會(huì)存在下面這個(gè)問題

    struct {int age;char sex; }man1;struct{int age;char sex; }man2;man1 = man2; // 報(bào)錯(cuò)

    雖然 man1 和 man2 是一樣的結(jié)構(gòu)體類型,但是編譯器會(huì)認(rèn)為是不同的類型。

    但如果用方式二就不會(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ǔ)言的東西。它的英文翻譯是 “類型定義”。下面就來看看它的用法。

    我更喜歡叫 typedef 為語(yǔ)義化,因?yàn)楹艽蟪潭壬鲜褂?typedef 是為了語(yǔ)義化,是需要結(jié)合現(xiàn)實(shí)世界的。

    typedef int Money

    這句代碼的意思就是,從今往后,Money 就可以代表 int 使用了。

    Money money ; // 此時(shí) money 就是 int 類型,等價(jià)于 int money;

    至于為什么使用 typedef 這樣的方式,個(gè)人最大的感受就是語(yǔ)義化吧,當(dāng)然 typedef 為什么要使用的其他原因可以自行谷歌。

    typedef 在結(jié)構(gòu)體的使用

    先來看看這段代碼

    typedef struct people {int age;char sex; } chinese;

    很多人會(huì)和結(jié)構(gòu)體的聲明弄混,其實(shí)不是,我用圖例來解釋就清楚了(對(duì)比結(jié)構(gòu)體聲明的圖例,觀察二者的區(qū)別)


    其中,people 表示的是結(jié)構(gòu)體的名字,正如前面所說,struct people 同 int,bool 這些是同一級(jí)別的概念。

    當(dāng)然,用 typedef 的時(shí)候,你也可以省略結(jié)構(gòu)的標(biāo)簽,所以你有時(shí)還會(huì)看到下面的寫法

    typedef struct {int age;char sex; } chinese;

    下面來看看數(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 都寫成一樣的 Node,具體的原因我也不是很清楚, // 有知道的同學(xué)可以在下面留言 // 但是僅就代碼而言 Node_1 表示的是結(jié)構(gòu)體的名稱,而 Node_2 表示的是代替簡(jiǎn)寫 // 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)體指針,有了指針,我們就 // 可以通過 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)成員的訪問

    主代碼

    struct people{int age;char sex; };struct people man1 , man2,man3,*man4;


    一個(gè)訪問 typedef 定義的結(jié)構(gòu)體的示例

    // c++ 版本 #include <iostream> using namespace std;int main() {typedef struct{int age;string name;}people, *ppeople;// 點(diǎn)操作符people zhangsan = {13, "zhangsan"};cout << zhangsan.age << endl; // 13cout << zhangsan.name << endl; // zhangsan// 箭頭操作符ppeople lisi = &zhangsan;lisi->age = 17;lisi->name = "lisi";cout << lisi->age << endl;cout << lisi->name << endl;return 0; }

    圖解

    總結(jié)

    以上是生活随笔為你收集整理的C 语言中的结构体(数据结构)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。