第9章-用戶自己建立數(shù)據(jù)類型_第1頁
第9章-用戶自己建立數(shù)據(jù)類型_第2頁
第9章-用戶自己建立數(shù)據(jù)類型_第3頁
第9章-用戶自己建立數(shù)據(jù)類型_第4頁
第9章-用戶自己建立數(shù)據(jù)類型_第5頁
免費預覽已結束,剩余60頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第9章

用戶自己定義數(shù)據(jù)類型

—C程序設計本章要點結構體的定義和引用結構體數(shù)組指向結構體類型數(shù)據(jù)的指針鏈表主要內(nèi)容概述定義結構體類型變量的方法(9.1)結構體數(shù)組(9.2)指向結構體類型數(shù)據(jù)的指針(9.3)用指針處理鏈表(9.4)共用體(9.5)用typedef定義類型(9.6)概述C語言的數(shù)據(jù)類型:C數(shù)據(jù)類型基本類型構造類型指針類型空類型void字符類型char枚舉類型enum整型實型單精度型float雙精度型double數(shù)組結構體struct共用體union短整型short長整型long整型int結構體struct概述

為何引進結構體?一類問題學生的學號、姓名、性別、年齡等信息圖書的書號、書名、出版社、價格等貨物的貨號、貨名、進出貨日期、價格等這類問題中數(shù)據(jù)有何特點,如何存儲?特點由幾個不同類型的數(shù)據(jù)組成一個有機整體。這個整體用一個數(shù)據(jù)元素表示。存儲:需要按一定順序同時存儲這些不同類型的數(shù)據(jù)。結構體:一組具有不同數(shù)據(jù)類型的數(shù)據(jù)的有序集合。結構體的每個元素包含若干個不同數(shù)據(jù)類型的成員。結構體的各個元素結構相同。定義結構體類型(9.1.1)結構體類型的聲明一般形式:struct[結構體名]{

成員表列};類型名成員名;類型名成員名;

……如:structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};;不可或缺說明:上述定義僅僅聲明一個結構體類型,還未定義結構體變量,還未分配內(nèi)存。標識符表示定義結構體類型變量的方法(9.1)定義結構體變量的三種方式:1.先聲明結構體類型再定義變量聲明結構體類型struct結構體名{

類型名成員名;類型名成員名;

……};定義結構體變量struct結構體名變量名表列;如:structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};structstudentstu1,stu2;定義結構體類型變量的方法(9.1)2.在聲明類型的同時定義變量struct結構體名{

類型名成員名;類型名成員名;

……}變量名列表;structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;struct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;3.直接定義結構體類型變量struct{

類型名成員名;類型名成員名;

…….}變量名列表;定義結構體類型變量的方法(9.1)內(nèi)存分配在定義了結構體變量后,系統(tǒng)為之分配的內(nèi)存單元字節(jié)數(shù)是結構體變量中各個成員的字節(jié)數(shù)之和。例如:stu1和stu2在內(nèi)存中各占63個字節(jié)(4+20+1+4+4+30=63)。namenumsexagescoreaddr4字節(jié)4字節(jié)20字節(jié)1字節(jié)4字節(jié)30字節(jié)……..namenumsexagescoreaddr4字節(jié)4字節(jié)20字節(jié)1字節(jié)4字節(jié)30字節(jié)……..stu2stu1structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;定義結構體類型變量的方法關于結構體類型的說明:類型和變量是不同的概念類型:確定一類數(shù)據(jù)的結構與性質;變量:數(shù)據(jù)類型:不分配內(nèi)存;變量:分配內(nèi)存類型:不能賦值、存取、運算;

變量:可以運算結構體變量的成員可以單獨使用,相當于普通變量。成員名可以與程序中的變量名相同,互不干擾。結構體可以嵌套,成員也可以是一個結構體。定義嵌套的結構體類型時,應滿足先定義后引用的原則。numnamebirthdaymonthdayyearstructstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;floatscore;例structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];structdatebirthday;}stu;結構體變量的引用結構體變量的引用除了賦值運算外,不能整體引用結構體變量,只能引用其成員。成員引用方式:結構體變量名.成員名例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age++;.成員運算符,優(yōu)先級最高,從左到右對結構體變量的成員可以像普通變量一樣進行各種運算。例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;printf(“%d,%s,%c,%d,%f,%s\n”,stu1);()stu1={101,“WanLin”,‘M’,19,87.5,“DaLian”};()if(stu1==stu2)……..()結構體變量的引用結構體變量的引用不能將一個結構體變量作為一個整體進行輸入輸出,對結構體變量的輸入輸出應對其成員逐個進行。例1:結構體變量的輸入輸出。#include<stdio.h>//例1structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};intmain(){structstudentstu;\\定義結構體student變量scanf("%d\n",&stu.num);gets();scanf("%c%d%f\n",&stu.sex,&stu.age,&stu.score);gets(stu.addr);printf("%d\n%s\n%c\n%d\n%.1f\n%s\n",stu.num,,stu.sex,stu.age,stu.score,stu.addr);return0;}輸入:1001LiQiangM1880

200BeijingRoad輸出:1001LiQiangM1880.0

200BeijingRoad結構體變量的引用結構體變量的引用可以將一個結構體變量的值賦值給另一個結構體變量例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu2=stu1;()結構體變量的引用結構體變量的引用結構體嵌套時逐級引用,直至最低級。例structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];structdatebirthday;}stu1,stu2;可以這樣訪問其成員:stu1.birthday.year不能用stu1.birthday來直接訪問stu1變量中的成員birthday,因為stu1.birthday本身是一個結構體變量。結構體變量的初始化形式一:struct結構體名{類型名成員名;類型名成員名;

……};struct結構體名結構體變量={初始數(shù)據(jù)};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstu1={112,"WangLin",'M',19,"200BeijingRoad"};結構體變量的初始化結構體變量的初始化形式二:struct結構體名{

類型名成員名;類型名成員名;

……}結構體變量={初始數(shù)據(jù)};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,"WangLin",'M',19,"200BeijingRoad"};

結構體變量的初始化結構體變量的初始化形式三:

struct{類型名成員名;類型名成員名;

……}結構體變量={初始數(shù)據(jù)};例struct{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,"WangLin",'M',19,"200BeijingRoad"};

結構體變量的初始化結構體變量的初始化例9.1對結構體變量初始化.//例9.1

#include<stdio.h>intmain(){structstudent

{longintnum;

charname[20];

charsex;

charaddr[20];

}a={10101,"LiLin",'M',"123BeijingRoad"};

/*對結構體變量a賦初值*/

printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n”,a.num,,a.sex,a.addr);

return0;}運行結果:No.:10101name:LiLinsex:Maddress:123BeijingRoad結構體數(shù)組(9.2)結構體數(shù)組的定義形式一:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[2];形式二:structstudent{intnum;charname[20];charsex;intage;}stu[2];形式三:struct{intnum;charname[20];charsex;intage;}stu[2];numnamesexagenumnamesexagestu[0]stu[1]29B分行初始化:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[3]={{100,"WangLin",'M',20},{101,"LiGang",'M',19},{110,"LiuYan",'F',19}};全部初始化時數(shù)組大小可省結構體數(shù)組初始化分行初始化:struct{intnum;charname[20];charsex;intage;}stu[]={{100,"WangLin",'M',20},{101,"LiGang",'M',19},{110,"LiuYan",'F',19}};分行初始化:structstudent{intnum;charname[20];charsex;intage;}stu[]={{100,"WangLin",'M',20},{101,"LiGang",'M',19},{110,"LiuYan",'F',19}};結構體數(shù)組(9.2)順序初始化:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[]={100,"WangLin",'M',20,101,"LiGang",'M',19,110,"LiuYan",'F',19};

structstudent{intnum;charname[20];charsex;intage;}stu[3];stu[1].age++;strcpy(stu[0].name,"ZhaoDa");結構體數(shù)組引用引用方式:結構體數(shù)組名[下標].成員名結構體數(shù)組(9.2)結構體數(shù)組的每個元素都是一個結構體變量,使用規(guī)則如同一般的結構體變量。結構體數(shù)組例9.2對候選人得票的統(tǒng)計程序。設有3個候選人,每次輸入一個得票的候選人的名字,要求最后輸出各人得票結果。#include"stdio.h"http://例9.2程序1#include"string.h"#defineN100structperson{charname[20];intcount;}leader[3]={"Li",0,"Zhang",0,"Fun",0};voidmain(){inti,j;charleader_name[20];for(i=1;i<=N;i++){scanf("%s",leader_name);for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;}for(i=0;i<3;i++)printf("%5s:%d\n",leader[i].name,leader[i].count);}namecountLiZhangFun000指向結構體類型數(shù)據(jù)的指針(9.3)指向結構體變量的指針一個結構體變量的指針就是該變量所占內(nèi)存的起始地址。例9.3指向結構體變量的指針的應用#include<string.h>//例9.3#include<stdio.h>

structstudent{longnum;charname[20];

charsex;floatscore;};intmain()

{

structstudentstu_1;

structstudent*p;p=&stu_1;stu_1.num=89101;strcpy(stu_1.name,"LiLin");

stu_1.sex='M';stu_1.score=89.5;

printf("No.:%ld\nname:%s\nsex:%c\nscore:%f\n",stu_1.num,stu_1.name,stu_1.sex,stu_1.score);printf("No.:%ld\nname:%s\nsex:%c\nscore:%f\n",(*p).num,(*p).name,(*p).sex,(*p).score);

return0;}運行結果:No.:89101

name:LiLinsex:Mscore:89.500000No.:89101

name:LiLinsex:Mscore:89.500000不等于*p.score指向結構體類型數(shù)據(jù)的指針(9.3)指向結構體變量的指針引用結構體變量的成員的三種方法:(設p是某結構體變量的指針)結構體變量.成員名(*p).成員名p->成員名(*p).num,(*p).name,(*p).sex,(*p).score)

p->num,p->name,p->sex,p->score->

指向運算符,優(yōu)先級最高,從左到右指向結構體類型數(shù)據(jù)的指針(9.3)指向結構體變量的指針例3指向結構體變量的指針的應用#include<string.h>//例3#include<stdio.h>

intmain()

{structstudent{longnum;charname[20];

charsex;floatscore;};

structstudentstu_1;

structstudent*p;p=&stu_1;stu_1.num=89101;strcpy(stu_1.name,"LiLin");

stu_1.sex='M';stu_1.score=89.5;

printf("No.:%ld\nname:%s\nsex:%c\nscore:%f\n",stu_1.num,stu_1.name,stu_1.sex,stu_1.score);printf("No.:%ld\nname:%s\nsex:%c\nscore:%f\n",p->num,p->name,p->sex,p->score);

return0;}指向結構體類型數(shù)據(jù)的指針(9.3)結構體數(shù)組與指針請分析以下幾種運算:(設p指向結構體某個結構體變量)p->np->n++++p->n(p++)->n(++p)->np所指向的結構體變量的成員n。(p->n)++++(p->n)

先引用p指向的結構體變量的成員n,p再增值。p先增值,再引用p指向的結構體變量的成員n。指向結構體類型數(shù)據(jù)的指針(9.3)結構體數(shù)組與指針例9.4用指針法操作結構體數(shù)組。#include<stdio.h>//例11.4(程序1)

structstudent

{intnum;

charname[20];

charsex;

intage;

};

intmain()

{structstudentstu[3]={{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19},

{10104,"WangMing",'F',20}};

structstudent*p;

printf("No.Namesexage\n");

for(p=stu;p<stu+3;p++)

printf("%-10d%-20s%-8c%-4d\n",p->num,p->name,p->sex,p->age);

return0;

}運行結果:No.Namesexage10101LiLinM18

10102ZhangFunM1910104WangMingF20

#include<stdio.h>//例11.4(程序2)

structstudent

{intnum;

charname[20];

charsex;

intage;

};

intmain()

{structstudentstu[3]={{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19},

{10104,"WangMing",'F',20}};

structstudent*p;

printf("No.Namesexage\n");

for(p=stu;p<stu+3;)

printf("%-10d%-20s%-8c%-4d\n",(p++)->num,(p++)->name,

(p++)->sex,(p++)->age);

return0;

}?#include<stdio.h>//例9.4(程序3)

typedef

structstudent

{intnum;

charname[20];

charsex;

intage;

}Student;

intmain()

{Studentstu[3]={{10101,"LiLin",'M',18},

{10102,"ZhangFun",'M',19},

{10104,"WangMing",'F',20}};

Student*p;

printf("No.Namesexage\n");

for(p=stu;p<stu+3;)

printf("%-10d%-20s%-8c%-4d\n",p->num,p->name,p->sex,(p++)->age);

return0;

}指向結構體類型數(shù)據(jù)的指針(9.3)注意:(1)如果p的初值為stu,即指向第一個元素,則p加1后p就指向下一個元素。例如:

(++p)->num先使p自加1,再得到它指向的元素的num成員值。(p++)->num先得到p->num的值,然后使p自加1,指向stu[1]。指向結構體類型數(shù)據(jù)的指針(9.3)用結構體變量和指向結構體的指針作函數(shù)參數(shù)將一個結構體變量的值傳遞給另一個函數(shù)的三種方法:用結構體變量的成員作實參用結構體變量作實參用指向結構體變量的指針作實參,將結構體變量的地址傳給對應的形參用結構體變量和指向結構體的指針作函數(shù)參數(shù)例9.5有一個結構體變量stu,內(nèi)含學生學號、姓名和三門課的成績。要求在main函數(shù)中為其賦值,在另一個函數(shù)print中輸出其值。(用結構體變量作函數(shù)參數(shù)。)#include<stdio.h>//例9.5

#include<string.h>

#defineFORMAT"%d\n%s\n%f\n%f\n%f\n"

structstudent

{

intnum;

charname[20];

floatscore[3];

};指向結構體類型數(shù)據(jù)的指針(9.3)intmain()

{

voidprint(structstudent);

structstudentstu;

stu.num=12345;

strcpy(,"LiLi");

stu.score[0]=67.5;

stu.score[1]=89;

stu.score[2]=78.6;

print(stu);

return0;

}

voidprint(structstudentstu)

{printf(FORMAT,stu.num,,

stu.score[0],stu.score[1],stu.score[2]);

printf("\n");

}運行結果:12345LiLi67.50000089.00000078.599998注意:結構體變量數(shù)組成員的引用方法。指向結構體類型數(shù)據(jù)的指針(9.3)例9.6將例9.5改用指向結構體變量的指針作參數(shù)。#include<stdio.h>//例9.6

#defineFORMAT"%d\n%s\n%f\n%f\n%f\n"structstudent{intnum;

charname[20];

floatscore[3];

};intmain()

{voidprint(structstudent*);

/*形參類型修改成指向結構體的指針變量*/

structstudentstu={12345,"LiLi",67.5,89,78.6};

print(&stu);/*實參改為stu的起始地址*/

return0;}

voidprint(structstudent*p)/*形參類型改為指針類型*/

{printf(FORMAT,p->num,p->name,

p->score[0],p->score[1],p->score[2]);

/*用指針變量調(diào)用各成員的值*/

printf("\n");}運行結果:12345LiLi67.50000089.00000078.599998指向結構體類型數(shù)據(jù)的指針(9.3)例4設一個學生的記錄包括學號,姓名和成績?nèi)?,將n個學生的記錄按成績從高到低的順序排列。程序:

程序指向結構體類型數(shù)據(jù)的指針(9.3)例5設一個學生的記錄包括學號,姓名和成績?nèi)棧瑢個學生的記錄按成績從高到低的順序排列,同時當成績相同時,按名字的字母字典順序從高到低順序排序。測試數(shù)據(jù)程序:

程序學號姓名成績這些數(shù)據(jù)你怎么存放、取出、刪除?用指針處理鏈表(9.4)鏈表鏈表是一種基本且重要的數(shù)據(jù)結構,是動態(tài)地進行存儲分配的一種結構。為何引進鏈表?數(shù)組存在的問題長度固定原因:靜態(tài)存儲分配插入刪除操作不方便原因:數(shù)據(jù)連續(xù)存儲鏈表的原理利用指針使得數(shù)據(jù)可以不連續(xù)存儲。動態(tài)存儲分配用指針處理鏈表(9.4)線性鏈表的組成:結點:存放用戶需要的實際數(shù)據(jù)和鏈接結點的指針。頭指針:存放第一個結點的地址,即指向第一個結點。表末標志:空指針NULL

利用結構體建立鏈表:

structstudent

{longnum;

floatscore;

structstudent*next;}*head;結點類型頭指針變量head1249用指針處理鏈表(9.4)鏈表的訪問例:需要訪問學號為10101,及10107學生的成績:head=1249printf(“%ld%5.1f”,head->num,head->score);printf(“\n%ld%5.1f”,head->next->next->num,head->next->next->score);結果:1010189.51010785.0用指針處理鏈表(9.4)例9.7建立一個簡單鏈表,它由3個學生數(shù)據(jù)的結點組成,輸出各結點中的數(shù)據(jù)。運行結果:1010189.51010390.01010785.0intmain()//例9.7

{structstudenta,b,c,*head,*p;

a.num=10101;a.score=89.5;//建立三個結點

b.num=10103;b.score=90;

c.num=10107;c.score=85;

head=&a;//鏈表結點的鏈接

a.next=&b;

b.next=&c;

c.next=NULL;

p=head;//p指向第一個結點

do

{printf("%ld%5.1f\n",p->num,p->score);

p=p->next;//移動p指向下一個結點

}

while(p!=NULL);//循環(huán)至遇表末標記

return0;

}#include<stdio.h>

structstudent

{longnum;

floatscore;

structstudent*next;

};用指針處理鏈表(9.4)處理動態(tài)鏈表所需的函數(shù)庫函數(shù)提供動態(tài)地開辟和釋放存儲單元的有關函數(shù):malloc函數(shù)函數(shù)原型:void*malloc(unsignedintsize);作用:在內(nèi)存的動態(tài)存儲區(qū)中分配一個長度為size的連續(xù)空間。返回值:一個指向分配域起始地址的指針(類型為void)。如果此函數(shù)未能成功地執(zhí)行(內(nèi)存空間不足),則返回空指針(NULL)。calloc函數(shù)函數(shù)原型:void*calloc(unsignedn,unsignedsize);作用:在內(nèi)存的動態(tài)存儲區(qū)中分配n個長度為size的連續(xù)空間。返回值:一個指向分配域起始地址的指針;如果分配不成功,返回NULL。用指針處理鏈表(9.4)處理動態(tài)鏈表所需的函數(shù)calloc函數(shù)用calloc函數(shù)可以為一維數(shù)組開辟動態(tài)存儲空間,n為數(shù)組元素個數(shù),每個元素長度為Size。free函數(shù)函數(shù)原型:voidfree(void*p);作用:釋放由p指向的內(nèi)存區(qū),使這部分內(nèi)存區(qū)能被其他變量使用。free函數(shù)無返回值。注意:使用以上庫函數(shù)需包含頭文件stdlib.h用指針處理鏈表(9.4)建立動態(tài)鏈表基本思想:在程序執(zhí)行過程中從空表開始建立一個鏈表,即一個一個地開辟結點和輸入各結點數(shù)據(jù),并建立起前后相鏈的關系。建立一個新結點的步驟:1.開辟新結點的存儲空間;2.將新結點鏈接到鏈表中;3.向新結點輸入數(shù)據(jù)(第2、3步順序可對調(diào))要點:新結點的鏈接,表頭的處理,表末標記用指針處理鏈表(9.4)例9.8寫一函數(shù)建立一個存儲若干學生數(shù)據(jù)的單向動態(tài)鏈表算法說明:約定學號不會為零,如果輸入的學號為0,則表示數(shù)據(jù)已輸入完。初始化:初始化鏈表為空表,head=NULL;指針變量:p1:指向新結點p2:指向新結點的前一個結點開辟新結點:使用函數(shù)malloc(Size)表頭的處理:令頭指針指向第一個建立的結點head=p1。新結點的鏈接:第二個結點起,令前一個結點的指針成員

p2->next=p1,接著使p2指向新鏈入的結點p2=p1。數(shù)據(jù)結束的判斷:當讀入的學號p->num等于0時,退出循環(huán)。表末標記的設置:p2->next=NULL;

圖9-12用指針處理鏈表(9.4)

圖9-13

圖9-14用指針處理鏈表(9.4)

圖9-15圖9-16用指針處理鏈表(9.4)建立鏈表#include<stdio.h>//例9.8#include<stdlib.h>#defineLENsizeof(structstudent)structstudent{longnum;floatscore;structstudent*next;};intmain(){structstudent*creat();

voidprint(structstudent*head);structstudent*head;head=creat();//建立鏈表print(head);//輸出鏈表

return0;}structstudent*creat(

)

//建立鏈表函數(shù){

structstudent*head;

structstudent*p1,*p2;

intn=0;

p1=p2=(structstudent*)malloc(LEN);scanf("%ld%f",&p1->num,&p1->score);head=NULL;while(p1->num!=0)

{n++;

if(n==1)

head=p1;

elsep2->next=p1;

p2=p1;

p1=(structstudent*)malloc(LEN);

scanf("%ld%f",&p1->num,&p1->score);

}

p2->next=NULL;

return(head);}p2->next=NULL;free(p1);return(head);用指針處理鏈表(9.4)更簡潔的建表方法structstudent*creat(

)

//建立鏈表函數(shù){

structstudent*head=NULL;

structstudent*p1=NULL,*p2=NULL;

p1=p2=(structstudent*)malloc(LEN);scanf("%ld%f",&p1->num,&p1->score);

while(p1->num!=0)

{

if(head==NULL)

head=p1;

else

p2->next=p1;

p2=p1;

p1=(structstudent*)malloc(LEN);

scanf("%ld%f",&p1->num,&p1->score);

}

p2->next=NULL;

free(p1);//釋放p1所指內(nèi)存空間

return(head);}用指針處理鏈表(9.4)輸出鏈表算法思想:定義一個指針變量p;通過頭指針得到鏈表第一個結點的地址:p=head;用指針變量p,從第一個結點起逐個指向鏈表的每個結點,輸出其數(shù)據(jù)。指針移動操作:p=p->next;遇表末標記,則鏈表輸出完畢。用指針處理鏈表(9.4)例9.9編寫一個輸出鏈表的函數(shù)print.//例9.9voidprint(structstudent*head)//輸出鏈表函數(shù){structstudent*p;printf("\nNow,These%drecordsare:\n",n);p=head;while(p!=NULL){printf("%ld%5.1f\n",p->num,p->score);p=p->next;}}共用體(9.5)C語言的數(shù)據(jù)類型:C數(shù)據(jù)類型基本類型構造類型指針類型空類型void字符類型char枚舉類型enum整型實型單精度型float雙精度型double數(shù)組結構體struct共用體union短整型short長整型long整型int共用體union共用體(9.5)共用體用途:使幾個不同類型的變量共占一段內(nèi)存(相互覆蓋)共用體類型定義:union共用體名{成員表列};例uniondata{shorti;charch;floatf;};fchi類型定義不分配內(nèi)存形式一:uniondata{shorti;charch;floatf;}a,b;形式二:uniondata{shorti;charch;floatf;};uniondataa,b,c,*p,d[3];形式三:union{shorti;charch;floatf;}a,b,c;共用體變量的定義fchifchiab共用體變量定義分配內(nèi)存,長度=最長成員所占字節(jié)數(shù)共用體變量任何時刻只有一個成員存在共用體共用體共用體變量引用引用方式:與結構體類似。共用體指針名->成員名共用體變量名.成員名(*共用體指針名).成員名uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];a.ia.cha.fp->ip->chp->f(*p).i(*p).ch(*p).fd[0].id[0].chd[0].f共用體共用體變量引用引用規(guī)則不能整體引用共用體變量,只能引用其成員。共用體變量中起作用的成員是最后一次存儲的成員。不能在定義共用體變量時初始化??梢杂靡粋€共用體變量為另一個變量賦值。共用體變量的地址和它的各成員的地址都是同一地址。如,&a,&a.i,&a.ch,&a.f都是同一個地址值。例union{inti;charch;floatf;}a={1,’a’,1.5};()例union{inti;charch;floatf;}a,b;a.i=1;a.ch=‘a(chǎn)’;a.f=1.5;b=a;()

例union{inti;charch;floatf;}a;a=1;()

例a.i=1;a.ch='a';a.f=1.5;printf("%d",a.i);(編譯通過,運行結果不對)

共用體共用體變量引用說明可以使用指向共用體變量的指針。共用體與結構體可以互相嵌套??梢远x共用體數(shù)組。共用體例9.12設有若干個人員的數(shù)據(jù),其中有學生和教師。學生的數(shù)據(jù)中包括:姓名、號碼、性別、職業(yè)、班級。教師的數(shù)據(jù)包括:姓名、號碼、性別、職業(yè)、職務??梢钥闯觯瑢W生和教師所包含的數(shù)據(jù)是不同的?,F(xiàn)要求把它們放在同一表格中。共用體算法:讀入position共用體voidmain(

){

inti,n;

printf("Inputthenumberofpeople:");

scanf("%d",&n);

for(i=0;i<n;i++)

{

scanf("%d

%s

%c

%c",&person[i].num,

person[i].name,

&person[i].sex,&person[i].job);

if(person[i].job=='s')

scanf("%d",&person[i].category.banji);

else

scanf("%s",person[i].category.position);}

//例9.12#include<stdio.h>struct{

intnum;

charname[10];

charsex;

charjob;

union

{

intbanji;

charposition[10];

}category;

}person[2];

/*先設人數(shù)為2*/共用體

printf("\n");

//例11.12

printf("No.

name

sexjobclass/position\n");

for(i=0;i<n;i++)

{

if(person[i].job=='s')

printf("%-10d%-10s%-10c%-410c%-10d\n",person[i].num,

person[i].name,person[i].sex,person[i].job,person[i].category.banji);

else

printf("%-10d%-10s%-10c%-10c%

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論