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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

(八)C语言之结构

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

今天來(lái)說(shuō)一下C語(yǔ)言里的結(jié)構(gòu)體(struct)、共用體(l聯(lián)合體)union、枚舉。

(一)結(jié)構(gòu)體:struct

1.1 概念

  • 是一種自定義的數(shù)據(jù)類(lèi)型
  • 結(jié)構(gòu)體是構(gòu)造類(lèi)型的一種
  • 不同數(shù)據(jù)類(lèi)型的集合
  • 地址空間連續(xù),每次分配最大數(shù)據(jù)類(lèi)型的寬度
  • 占用內(nèi)存為所有變量的總大小(注意字節(jié)對(duì)齊問(wèn)題)

1.2 定義

1.先定義結(jié)構(gòu)體類(lèi)型,再說(shuō)明結(jié)構(gòu)體變量

struct stu {char *name; //姓名int num; //學(xué)號(hào)int age; //年齡float score; //成績(jī) }; struct stu student;

上面的程序使用strcuct關(guān)鍵字定義了一個(gè)結(jié)構(gòu)體名為stu的結(jié)構(gòu)體類(lèi)型。和定義變量一樣,聲明一個(gè)結(jié)構(gòu)體類(lèi)型變量可以使用:數(shù)據(jù)類(lèi)型 變量名 的形式。
struct stu student表示定義了一個(gè)變量名為stduent,類(lèi)型為stu的結(jié)構(gòu)體。該結(jié)構(gòu)體含有4個(gè)成員:name、num、age、score
注意大括號(hào)后面的分號(hào);不能少,這是一條完整的語(yǔ)句。
2.定義結(jié)構(gòu)體類(lèi)型的同時(shí)定義結(jié)構(gòu)體變量

struct stu {char *name; //姓名int num; //學(xué)號(hào)int age; //年齡float score; //成績(jī) }student;

在定義時(shí)直接聲明結(jié)構(gòu)體變量,只需要將結(jié)構(gòu)體變量名放在花括號(hào)后面,并加上分號(hào)即可。
3.直接說(shuō)明結(jié)構(gòu)體變量

struct {char *name; //姓名int num; //學(xué)號(hào)int age; //年齡float score; //成績(jī) } student;

這種定義方式并不常用,這樣做書(shū)寫(xiě)雖然簡(jiǎn)單,但是因?yàn)闆](méi)有結(jié)構(gòu)體名,后面就沒(méi)法用該結(jié)構(gòu)體定義新的變量。
4.typedef重定義

typedef struct {char *name; //姓名int num; //學(xué)號(hào)int age; //年齡float score; //成績(jī) } STU; STU student;

這種方式比較常見(jiàn),我們使用typedef重定義結(jié)構(gòu)體為STU,這里STU就是此結(jié)構(gòu)體類(lèi)型,可以用STU去定義結(jié)構(gòu)體變量

1.3 初始化

1.在定義結(jié)構(gòu)體變量的時(shí)候全部初始化

struct stu {char *name; //姓名int num; //學(xué)號(hào)int age; //年齡float score; //成績(jī) }student={“ha”,1234,56,99};

2.定義完結(jié)構(gòu)體變量后,之后只能單個(gè)賦值

struct stu {char *name; //姓名int num; //學(xué)號(hào)int age; //年齡float score; //成績(jī) }; struct stu student; student.name="ha"; student.num=1234; student.age=56; student.score=99;

1.4 調(diào)用

結(jié)構(gòu)體變量.成員

結(jié)構(gòu)體變量名+點(diǎn)(’.’)+成員就可以調(diào)用了

1.5 結(jié)構(gòu)體指針

當(dāng)一個(gè)指針變量指向結(jié)構(gòu)體時(shí),我們就稱(chēng)它為結(jié)構(gòu)體指針。C語(yǔ)言結(jié)構(gòu)體指針的定義形式一般為:

struct 結(jié)構(gòu)體名 *變量名; //結(jié)構(gòu)體 struct stu{char *name; //姓名int num; //學(xué)號(hào)int age; //年齡float score; //成績(jī) } stu1 = { "hah", 12, 18, 23, 136.5 }; //結(jié)構(gòu)體指針 struct stu *pstu = &stu1;

注意結(jié)構(gòu)體變量名和數(shù)組名不同,數(shù)組名在表達(dá)式中會(huì)被轉(zhuǎn)換為數(shù)組指針,而結(jié)構(gòu)體變量名不會(huì),無(wú)論在任何表達(dá)式中它表示的都是整個(gè)集合本身,要想取得結(jié)構(gòu)體變量的地址,必須在前面加&,所以給 pstu 賦值只能寫(xiě)作:

1.6 獲取結(jié)構(gòu)體成員

通過(guò)結(jié)構(gòu)體指針可以獲取結(jié)構(gòu)體成員,一般形式為:

(*pointer).memberName

或者:

pointer->memberName

第一種寫(xiě)法中,.的優(yōu)先級(jí)高于*,(pointer)兩邊的括號(hào)不能少。如果去掉括號(hào)寫(xiě)作pointer.memberName,那么就等效于*(pointer.memberName),這樣意義就完全不對(duì)了。

第二種寫(xiě)法中,->是一個(gè)新的運(yùn)算符,習(xí)慣稱(chēng)它為“箭頭”,有了它,可以通過(guò)結(jié)構(gòu)體指針直接取得結(jié)構(gòu)體成員;這也是->在C語(yǔ)言中的唯一用途。

1.7 結(jié)構(gòu)體內(nèi)存分析

注意點(diǎn)

  • 給整個(gè)結(jié)構(gòu)體變量分配儲(chǔ)存空間和數(shù)組一樣,從內(nèi)存地址比較大的開(kāi)始分配
  • 給結(jié)構(gòu)體變量中的屬性分配儲(chǔ)存空間也和數(shù)組一樣,從所占內(nèi)存地址比較小的開(kāi)始分配
  • 定義結(jié)構(gòu)體類(lèi)型不會(huì)分配儲(chǔ)存空間,只有定義結(jié)構(gòu)體變量的時(shí)候才會(huì)分配儲(chǔ)存空間
    • 結(jié)構(gòu)體在分配內(nèi)存的時(shí)候,會(huì)做一個(gè)內(nèi)存對(duì)齊的操作
    • 會(huì)先獲取所有屬性中占用內(nèi)存最大的屬性的字節(jié)數(shù)
    • 然后在開(kāi)辟出最大屬性字節(jié)的內(nèi)存給第一個(gè)屬性,如果分配給第一個(gè)屬性之后還能繼續(xù)分配給第二個(gè)屬性,那么就繼續(xù)分配給第二個(gè)屬性
    • 如果分配給第一個(gè)屬性之后,剩余的內(nèi)存不夠分配給第二個(gè)屬性了,那么會(huì)再次開(kāi)辟最大屬性的內(nèi)存,再次分配 依次類(lèi)推
    #include <stdio.h>int main(){//定義結(jié)構(gòu)體struct Person{char name; // 1 個(gè)節(jié)點(diǎn) //開(kāi)辟4個(gè)字節(jié) char 占用1個(gè)int age; // 4個(gè)字節(jié) // 剩余三個(gè) 不夠int 再開(kāi)辟4個(gè)字節(jié)int money; // 4個(gè)字節(jié) // 再開(kāi)辟4個(gè)字節(jié)};struct Person p; // 所以p = 4+4+4printf("sizeof(p) = %i\n",sizeof(p)); // 12個(gè)字節(jié)return 0; }

    (二)共用體(聯(lián)合體):union

    2.1概念

    • 所有變量共用一段空間
    • 每次分配按最大長(zhǎng)度進(jìn)行分配
    • 是一種構(gòu)造數(shù)據(jù)類(lèi)型
    • 同一時(shí)刻只能保存一個(gè)成員的值
    • 不能直接引用共用體變量名

    2.2定義

    它的定義和結(jié)構(gòu)體一樣,分為先定義共用體再說(shuō)明共用體變量、在定義共用體的同時(shí)說(shuō)明共用體變量、直接說(shuō)明共用體變量

    union 共用體名{成員列表 };

    示例:

    //先定義共用體再說(shuō)明共用體變量 union data{int n;char ch;double f; }; union data a, b, c;

    2.3 引用

    和結(jié)構(gòu)體一樣,通過(guò)共用體變量名 . 成員名

    union data{int n;char ch;double f; } a, b, c; a.n=3;

    關(guān)于共用體的詳細(xì)介紹可以看下這篇文章C語(yǔ)言共用體(C語(yǔ)言u(píng)nion用法)詳解,講到共用體這里要說(shuō)明一下大小端模式的問(wèn)題。

    小端模式:低地址存放低字節(jié),高地址存放高字節(jié)
    大端模式:低地址存放高字節(jié),高地址存放低字節(jié)

    (三)枚舉:enum

    3.1 概念

    • 作用:列舉出所有的可能性,增強(qiáng)代碼的可閱讀性
    • 枚舉成員都是常量
    • 不能再對(duì)已經(jīng)定義好的枚舉常量賦值

    3.1 定義

    enum 枚舉名 { 枚舉變量 };

    示例:

    enum week { Mon, Tues, Wed, Thurs, Fri, Sat, Sun}; typedef enum { Mon, Tues, Wed, Thurs, Fri, Sat, Sun }Date;

    枚舉是一種類(lèi)型,通過(guò)它可以定義枚舉變量:

    Date a,b,c

    我們也可以給每個(gè)名字都指定一個(gè)值:

    enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 };

    更為簡(jiǎn)單的方法是只給第一個(gè)名字指定值:

    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };

    這樣枚舉值就從 1 開(kāi)始遞增,跟上面的寫(xiě)法是等效的。
    也可以在定義枚舉類(lèi)型的同時(shí)定義變量:

    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a, b, c;

    有了枚舉變量,就可以把列表中的值賦給它:

    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun }; enum week a = Mon, b = Wed, c = Sat;

    或者:

    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a = Mon, b = Wed, c = Sat;

    特點(diǎn):可以在定義枚舉時(shí)給成員賦值,被賦值的成員往后依次增加1,也可以在中間改變某一個(gè)成員的值。

    3.1 引用

    直接使用就行,需要注意的是**枚舉列表中的數(shù)據(jù)作用范圍是全局的,不能在定義與它們名字相同的白能量;Mon、Tues、Wed 等都是常量,不能對(duì)它們賦值,只能將它們的值賦給其他的變量。
    示例:

    #include <stdio.h> int main(){enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;scanf("%d", &day);switch(day){case 1: puts("Monday"); break;case 2: puts("Tuesday"); break;case 3: puts("Wednesday"); break;case 4: puts("Thursday"); break;case 5: puts("Friday"); break;case 6: puts("Saturday"); break;case 7: puts("Sunday"); break;default: puts("Error!");}return 0; }

    Mon、Tues、Wed 這些名字都被替換成了對(duì)應(yīng)的數(shù)字。這意味著,Mon、Tues、Wed 等都不是變量,它們不占用數(shù)據(jù)區(qū)(常量區(qū)、全局?jǐn)?shù)據(jù)區(qū)、棧區(qū)和堆區(qū))的內(nèi)存,而是直接被編譯到命令里面,放到代碼區(qū),所以不能用&取得它們的地址。這就是枚舉的本質(zhì)。


    本文章僅供學(xué)習(xí)交流用禁止用作商業(yè)用途,文中內(nèi)容來(lái)水枂編輯,如需轉(zhuǎn)載請(qǐng)告知,謝謝合作

    微信公眾號(hào):zhjj0729

    微博:文藝to青年

    總結(jié)

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

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