久久精品99久久_亚洲一区二区综合_狠狠色伊人亚洲综合成人_亚洲综合爱爱久久网

您好,歡迎進入深圳市穎特新科技有限公司官方網站!

您現在的位置:首頁 新聞資訊 >> 新聞頭條 >> 結構體
新聞資訊
NEWS INFORMATION

結構體

發布時間:2019-05-22

它是一組具有相同類型的數據的集合。但在實際的編程過程中,我們往往還需要一組類型不同的數據,例如對于學生信息登記表,姓名為字符串,學號為整數,年齡為整數,所在的學習小組為字符,成績為小數,因為數據類型不同,顯然不能用一個數組來存放。

在C語言中,可以使用結構體(Struct)來存放一組不同類型的數據。結構體的定義形式為:

struct 結構體名{
    結構體所包含的變量或數組
};

結構體是一種集合,它里面包含了多個變量或數組,它們的類型可以相同,也可以不同,每個這樣的變量或數組都稱為結構體的成員(Member)。請看下面的一個例子:

  1. struct stu{
  2. char *name; //姓名
  3. int num; //學號
  4. int age; //年齡
  5. char group; //所在學習小組
  6. float score; //成績
  7. };

stu 為結構體名,它包含了 5 個成員,分別是 name、num、age、group、score。結構體成員的定義方式與變量和數組的定義方式相同,只是不能初始化。

注意大括號后面的分號;不能少,這是一條完整的語句。

結構體也是一種數據類型,它由程序員自己定義,可以包含多個其他類型的數據。

像 int、float、char 等是由C語言本身提供的數據類型,不能再進行分拆,我們稱之為基本數據類型;而結構體可以包含多個基本類型的數據,也可以包含其他的結構體,我們將它稱為復雜數據類型或構造數據類型。

結構體變量

既然結構體是一種數據類型,那么就可以用它來定義變量。例如:

struct stu stu1, stu2;

定義了兩個變量 stu1 和 stu2,它們都是 stu 類型,都由 5 個成員組成。注意關鍵字struct不能少。

stu 就像一個“模板”,定義出來的變量都具有相同的性質。也可以將結構體比作“圖紙”,將結構體變量比作“零件”,根據同一張圖紙生產出來的零件的特性都是一樣的。

你也可以在定義結構體的同時定義結構體變量:

  1. struct stu{
  2. char *name; //姓名
  3. int num; //學號
  4. int age; //年齡
  5. char group; //所在學習小組
  6. float score; //成績
  7. } stu1, stu2;

將變量放在結構體定義的最后即可。

如果只需要 stu1、stu2 兩個變量,后面不需要再使用結構體名定義其他變量,那么在定義時也可以不給出結構體名,如下所示:

  1. struct{ //沒有寫 stu
  2. char *name; //姓名
  3. int num; //學號
  4. int age; //年齡
  5. char group; //所在學習小組
  6. float score; //成績
  7. } stu1, stu2;

這樣做書寫簡單,但是因為沒有結構體名,后面就沒法用該結構體定義新的變量。

理論上講結構體的各個成員在內存中是連續存儲的,和數組非常類似,例如上面的結構體變量 stu1、stu2 的內存分布如下圖所示,共占用 4+4+4+1+4 = 17 個字節。


但是在編譯器的具體實現中,各個成員之間可能會存在縫隙,對于 stu1、stu2,成員變量 group 和 score 之間就存在 3 個字節的空白填充(見下圖)。這樣算來,stu1、stu2 其實占用了 17 + 3 = 20 個字節。

關于成員變量之間存在“裂縫”的原因,我們將在《C語言和內存》專題中的《C語言內存對齊,提高尋址效率》一節中詳細講解。

成員的獲取和賦值

結構體和數組類似,也是一組數據的集合,整體使用沒有太大的意義。數組使用下標[ ]獲取單個元素,結構體使用點號.獲取單個成員。獲取結構體成員的一般格式為:

結構體變量名.成員名;

通過這種方式可以獲取成員的值,也可以給成員賦值:

  1. #include <stdio.h>
  2. int main(){
  3. struct{
  4. char *name; //姓名
  5. int num; //學號
  6. int age; //年齡
  7. char group; //所在小組
  8. float score; //成績
  9. } stu1;
  10. //給結構體成員賦值
  11. stu1.name = "Tom";
  12. stu1.num = 12;
  13. stu1.age = 18;
  14. stu1.group = 'A';
  15. stu1.score = 136.5;
  16. //讀取結構體成員的值
  17. printf("%s的學號是%d,年齡是%d,在%c組,今年的成績是%.1f!\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);
  18. return 0;
  19. }

運行結果:
Tom的學號是12,年齡是18,在A組,今年的成績是136.5!

除了可以對成員進行逐一賦值,也可以在定義時整體賦值,例如:

  1. struct{
  2. char *name; //姓名
  3. int num; //學號
  4. int age; //年齡
  5. char group; //所在小組
  6. float score; //成績
  7. } stu1, stu2 = { "Tom", 12, 18, 'A', 136.5 };

不過整體賦值僅限于定義結構體變量的時候,在使用過程中只能對成員逐一賦值,這和數組的賦值非常類似。

需要注意的是,結構體是一種自定義的數據類型,是創建變量的模板,不占用內存空間;結構體變量才包含了實實在在的數據,需要內存空間來存儲。

所謂結構體數組,是指數組中的每個元素都是一個結構體。在實際應用中,結構體數組常被用來表示一個擁有相同數據結構的群體,比如一個班的學生、一個車間的職工等。

定義結構體數組和定義結構體變量的方式類似,請看下面的例子:

  1. struct stu{
  2. char *name; //姓名
  3. int num; //學號
  4. int age; //年齡
  5. char group; //所在小組
  6. float score; //成績
  7. }class[5];

表示一個班級有5個學生。

結構體數組在定義的同時也可以初始化,例如:

  1. struct stu{
  2. char *name; //姓名
  3. int num; //學號
  4. int age; //年齡
  5. char group; //所在小組
  6. float score; //成績
  7. }class[5] = {
  8. {"Li ping", 5, 18, 'C', 145.0},
  9. {"Zhang ping", 4, 19, 'A', 130.5},
  10. {"He fang", 1, 18, 'A', 148.5},
  11. {"Cheng ling", 2, 17, 'F', 139.0},
  12. {"Wang ming", 3, 17, 'B', 144.5}
  13. };

當對數組中全部元素賦值時,也可不給出數組長度,例如:

  1. struct stu{
  2. char *name; //姓名
  3. int num; //學號
  4. int age; //年齡
  5. char group; //所在小組
  6. float score; //成績
  7. }class[] = {
  8. {"Li ping", 5, 18, 'C', 145.0},
  9. {"Zhang ping", 4, 19, 'A', 130.5},
  10. {"He fang", 1, 18, 'A', 148.5},
  11. {"Cheng ling", 2, 17, 'F', 139.0},
  12. {"Wang ming", 3, 17, 'B', 144.5}
  13. };


結構體數組的使用也很簡單,例如,獲取 Wang ming 的成績:

class[4].score;

修改 Li ping 的學習小組:

class[0].group = 'B';


【示例】計算全班學生的總成績、平均成績和以及 140 分以下的人數。

  1. #include <stdio.h>
  2. struct{
  3. char *name; //姓名
  4. int num; //學號
  5. int age; //年齡
  6. char group; //所在小組
  7. float score; //成績
  8. }class[] = {
  9. {"Li ping", 5, 18, 'C', 145.0},
  10. {"Zhang ping", 4, 19, 'A', 130.5},
  11. {"He fang", 1, 18, 'A', 148.5},
  12. {"Cheng ling", 2, 17, 'F', 139.0},
  13. {"Wang ming", 3, 17, 'B', 144.5}
  14. };
  15. int main(){
  16. int i, num_140 = 0;
  17. float sum = 0;
  18. for(i=0; i<5; i++){
  19. sum += class[i].score;
  20. if(class[i].score < 140) num_140++;
  21. }
  22. printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n", sum, sum/5, num_140);
  23. return 0;
  24. }

運行結果:
sum=707.50
average=141.50
num_140=2

指針也可以指向一個結構體,定義的形式一般為:

struct 結構體名 *變量名;

下面是一個定義結構體指針的實例:

  1. struct stu{
  2. char *name; //姓名
  3. int num; //學號
  4. int age; //年齡
  5. char group; //所在小組
  6. float score; //成績
  7. } stu1 = { "Tom", 12, 18, 'A', 136.5 };
  8. //結構體指針
  9. struct stu *pstu = &stu1;

也可以在定義結構體的同時定義結構體指針:

  1. struct stu{
  2. char *name; //姓名
  3. int num; //學號
  4. int age; //年齡
  5. char group; //所在小組
  6. float score; //成績
  7. } stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;

注意,結構體變量名和數組名不同,數組名在表達式中會被轉換為數組指針,而結構體變量名不會,無論在任何表達式中它表示的都是整個集合本身,要想取得結構體變量的地址,必須在前面加&,所以給 pstu 賦值只能寫作:

struct stu *pstu = &stu1;

而不能寫作:

struct stu *pstu = stu1;

還應該注意,結構體和結構體變量是兩個不同的概念:結構體是一種數據類型,是一種創建變量的模板,編譯器不會為它分配內存空間,就像 int、float、char 這些關鍵字本身不占用內存一樣;結構體變量才包含實實在在的數據,才需要內存來存儲。下面的寫法是錯誤的,不可能去取一個結構體名的地址,也不能將它賦值給其他變量:

struct stu *pstu = &stu;
struct stu *pstu = stu;

獲取結構體成員

通過結構體指針可以獲取結構體成員,一般形式為:

(*pointer).memberName

或者:

pointer->memberName

第一種寫法中,.的優先級高于*(*pointer)兩邊的括號不能少。如果去掉括號寫作*pointer.memberName,那么就等效于*(pointer.memberName),這樣意義就完全不對了。

第二種寫法中,->是一個新的運算符,習慣稱它為“箭頭”,有了它,可以通過結構體指針直接取得結構體成員;這也是->在C語言中的唯一用途。

上面的兩種寫法是等效的,我們通常采用后面的寫法,這樣更加直觀。

【示例】結構體指針的使用。

  1. #include <stdio.h>
  2. int main(){
  3. struct{
  4. char *name; //姓名
  5. int num; //學號
  6. int age; //年齡
  7. char group; //所在小組
  8. float score; //成績
  9. } stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;
  10. //讀取結構體成員的值
  11. printf("%s的學號是%d,年齡是%d,在%c組,今年的成績是%.1f!\n", (*pstu).name, (*pstu).num, (*pstu).age, (*pstu).group, (*pstu).score);
  12. printf("%s的學號是%d,年齡是%d,在%c組,今年的成績是%.1f!\n", pstu->name, pstu->num, pstu->age, pstu->group, pstu->score);
  13. return 0;
  14. }

運行結果:
Tom的學號是12,年齡是18,在A組,今年的成績是136.5!
Tom的學號是12,年齡是18,在A組,今年的成績是136.5!

【示例】結構體數組指針的使用。

  1. #include <stdio.h>
  2. struct stu{
  3. char *name; //姓名
  4. int num; //學號
  5. int age; //年齡
  6. char group; //所在小組
  7. float score; //成績
  8. }stus[] = {
  9. {"Zhou ping", 5, 18, 'C', 145.0},
  10. {"Zhang ping", 4, 19, 'A', 130.5},
  11. {"Liu fang", 1, 18, 'A', 148.5},
  12. {"Cheng ling", 2, 17, 'F', 139.0},
  13. {"Wang ming", 3, 17, 'B', 144.5}
  14. }, *ps;
  15. int main(){
  16. //求數組長度
  17. int len = sizeof(stus) / sizeof(struct stu);
  18. printf("Name\t\tNum\tAge\tGroup\tScore\t\n");
  19. for(ps=stus; ps<stus+len; ps++){
  20. printf("%s\t%d\t%d\t%c\t%.1f\n", ps->name, ps->num, ps->age, ps->group, ps->score);
  21. }
  22. return 0;
  23. }

運行結果:

Name            Num     Age     Group   Score
Zhou ping       5       18      C       145.0
Zhang ping      4       19      A       130.5
Liu fang        1       18      A       148.5
Cheng ling      2       17      F       139.0
Wang ming       3       17      B       144.5

結構體指針作為函數參數

結構體變量名代表的是整個集合本身,作為函數參數時傳遞的整個集合,也就是所有成員,而不是像數組一樣被編譯器轉換成一個指針。如果結構體成員較多,尤其是成員為數組時,傳送的時間和空間開銷會很大,影響程序的運行效率。所以最好的辦法就是使用結構體指針,這時由實參傳向形參的只是一個地址,非常快速。

【示例】計算全班學生的總成績、平均成績和以及 140 分以下的人數。

  1. #include <stdio.h>
  2. struct stu{
  3. char *name; //姓名
  4. int num; //學號
  5. int age; //年齡
  6. char group; //所在小組
  7. float score; //成績
  8. }stus[] = {
  9. {"Li ping", 5, 18, 'C', 145.0},
  10. {"Zhang ping", 4, 19, 'A', 130.5},
  11. {"He fang", 1, 18, 'A', 148.5},
  12. {"Cheng ling", 2, 17, 'F', 139.0},
  13. {"Wang ming", 3, 17, 'B', 144.5}
  14. };
  15. void average(struct stu *ps, int len);
  16. int main(){
  17. int len = sizeof(stus) / sizeof(struct stu);
  18. average(stus, len);
  19. return 0;
  20. }
  21. void average(struct stu *ps, int len){
  22. int i, num_140 = 0;
  23. float average, sum = 0;
  24. for(i=0; i<len; i++){
  25. sum += (ps + i) -> score;
  26. if((ps + i)->score < 140) num_140++;
  27. }
  28. printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n", sum, sum/5, num_140);
  29. }

運行結果:
sum=707.50
average=141.50
num_140=2

 

聯系方式0755-82591179

郵箱:ivy@yingtexin.net

地址:深圳市南山區桃源街道平山社區平山一路2號南山云谷創業園二期11棟410-411

久久精品99久久_亚洲一区二区综合_狠狠色伊人亚洲综合成人_亚洲综合爱爱久久网
九九九九九国产| 美女网站色免费| 日韩精品第1页| 日韩不卡视频一区二区| 捷克做爰xxxⅹ性视频| 中文av一区二区三区| 久久婷五月综合| 中文字幕第三区| 日本a级片在线观看| 成人在线观看毛片| 97在线国产视频| aⅴ在线免费观看| 男人添女人下面免费视频| 国产成年人视频网站| 特级黄色录像片| 成年人视频观看| wwwwwxxxx日本| 2022中文字幕| 欧美牲交a欧美牲交aⅴ免费下载| 成人亚洲视频在线观看| 日本激情视频在线| 性久久久久久久久久久久久久| 性做爰过程免费播放| 狠狠噜天天噜日日噜| 久久99中文字幕| 五月婷婷丁香色| 少妇一晚三次一区二区三区| www.av中文字幕| 中文字幕永久视频| 91成人综合网| xx欧美撒尿嘘撒尿xx| 可以在线看黄的网站| 国产极品美女高潮无套久久久| 欧美xxxxxbbbbb| 黑人糟蹋人妻hd中文字幕| 鲁一鲁一鲁一鲁一av| 草草视频在线免费观看| 天天做天天干天天操| 欧美日韩二三区| 男女h黄动漫啪啪无遮挡软件| 少妇人妻互换不带套| 青青在线视频免费观看| 中文字幕亚洲影院| 国产一二三四在线视频| 国产素人在线观看| 国产在线xxxx| 韩国黄色一级大片| 日韩在线一区视频| 不卡av免费在线| 欧美色图色综合| 国产精品国产对白熟妇| 91香蕉视频免费看| 欧美国产日韩另类 | 99er在线视频| 在线观看视频黄色| 亚洲一二三av| 亚洲 欧美 另类人妖| 亚洲爆乳无码专区| 国产精品亚洲a| 人妻有码中文字幕| 男女高潮又爽又黄又无遮挡| 欧美一区二区视频在线播放| 超碰10000| 日韩人妻无码精品久久久不卡| 亚洲在线观看网站| 精产国品一二三区| 91视频福利网| 自拍一级黄色片| 蜜桃视频成人在线观看| 国产性生活免费视频| 日本精品久久久久久久久久| 99热这里只有精品免费| 老太脱裤让老头玩ⅹxxxx| 欧美日韩在线一| 91香蕉视频污版| 亚洲精品免费一区亚洲精品免费精品一区| 高潮一区二区三区| 日韩av影视大全| 无码粉嫩虎白一线天在线观看| 久在线观看视频| 男人插女人下面免费视频| 亚欧激情乱码久久久久久久久| 亚洲精品乱码久久久久久动漫| 日本天堂免费a| 久草精品在线播放| 在线视频日韩欧美| 麻豆tv在线播放| 亚洲另类第一页| 国产美女永久无遮挡| www.中文字幕在线| 三级黄色片免费看| 精品这里只有精品| 亚洲一级片免费观看| 波多野结衣家庭教师在线播放| 亚洲 激情 在线| 搞av.com| 中文字幕黄色大片| av动漫在线观看| 国产成人亚洲综合无码| 国产一级不卡毛片| 成人在线播放网址| 日本中文字幕精品—区二区| www.av91| 亚洲一区二区三区观看| 69堂免费视频| 国产精品videossex国产高清 | 第九区2中文字幕| 一级在线免费视频| 中国丰满人妻videoshd | 精品少妇一区二区三区在线| 亚洲欧美手机在线| 妓院一钑片免看黄大片| 欧美图片激情小说| 久久久九九九热| www.色就是色| 国产一区二区视频免费在线观看| 成年在线观看视频| 国产一二三四五| 精品综合久久久久| 日本xxxx黄色| 少妇一级淫免费放| 999在线免费视频| 日韩中文字幕免费在线| 少妇av一区二区三区无码| 日本免费a视频| 丁香花在线影院观看在线播放 | 一级片黄色免费| 日韩av自拍偷拍| 韩国一区二区在线播放| 91福利免费观看| 亚洲精品中文字幕乱码无线| 国产一区亚洲二区三区| 国产日产欧美视频| 欧美性猛交xxx乱久交| 四季av一区二区| 成年人三级黄色片| 亚洲自拍偷拍一区二区三区| 日本特黄在线观看| 日本一道在线观看| 久久99久久99精品| 欧美aⅴ在线观看| av网站在线不卡| 在线观看视频在线观看| 青青草综合视频| 日韩在线视频在线观看| 青青在线视频免费| 日本成人性视频| 国产视频在线观看网站| 欧美色图另类小说| 天天干天天色天天干| 欧美少妇在线观看| 欧美a在线视频| 成人av毛片在线观看| wwwwww欧美| 九九热免费精品视频| 国内自拍第二页| 国产午夜福利在线播放| 午夜久久福利视频| www.99热这里只有精品| 欧美一级视频在线| www在线观看免费| 欧美国产日韩另类| 2022亚洲天堂| 大地资源网在线观看免费官网| www.中文字幕在线| 无码人妻精品一区二区三区99v| 国产视频九色蝌蚪| 成人免费看片视频在线观看| 欧美一区二区三区爽大粗免费| 一女二男3p波多野结衣| 欧美视频在线观看网站| 午夜大片在线观看| 黄色三级视频片| 成人综合视频在线| 一本之道在线视频| 亚洲欧美偷拍另类| 日日摸日日碰夜夜爽av| 国产尤物av一区二区三区| www.久久av.com| 一区二区成人网| 美女福利视频在线| www.av毛片| 丁香婷婷综合激情| 国产成人精品免费看在线播放| 日本免费观看网站| 日韩有码免费视频| 噜噜噜久久亚洲精品国产品麻豆| 成人国产在线看| 九九久久九九久久| 欧美日韩dvd| 日本精品福利视频| 国产女主播av| 日韩一级特黄毛片| 国产精品国三级国产av| aaa免费在线观看| 91看片淫黄大片91| 青青草免费在线视频观看| 国产盗摄视频在线观看| 蜜臀av性久久久久蜜臀av| 黄色网在线视频|