版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第7章自定義數(shù)據(jù)類型1)用戶根據(jù)需要自己聲明一些類型:數(shù)組2)用戶可以自己聲明的類型還有:結(jié)構(gòu)體(structure)類型共用體(union)類型枚舉(enumeration)類型類(class)類型3)稱用戶自定義類型,user-definedtype,UDT本章學(xué)習(xí)7.1結(jié)構(gòu)體類型7.1.1概述1、什么是結(jié)構(gòu)體將不同類型的數(shù)據(jù)組合成一個有機的整體,
C++語言提供了一種數(shù)據(jù)結(jié)構(gòu),稱為結(jié)構(gòu)體。例:
structStudent{ intnum;//學(xué)號
charname[20];//姓名
charsex;//性別
intage;//年齡};2、結(jié)構(gòu)體類型聲明方式
struct結(jié)構(gòu)體類型名{成員表列};//注意分號不要遺漏其中:成員表列中放入各個成員的類型聲明。
例:
structStudent{ intnum;//類型名成員名; charname[20]; charsex; intage;};3、名詞1)結(jié)構(gòu)體類型名例:structStudent{ intnum;//每個成員的聲明語句
charname[20];};
結(jié)構(gòu)體類型名:Student2)成員名如:num,name3)域表:成員表列4)一個域:結(jié)構(gòu)體中的每一個成員(分量)。5)結(jié)構(gòu)體類型可全局聲明,也可局部聲明。7.1.2結(jié)構(gòu)體類型變量的定義方法及初始化1、定義結(jié)構(gòu)體類型變量的方法說明:使用結(jié)構(gòu)體時,不能使用結(jié)構(gòu)體類型名,只能使用結(jié)構(gòu)體變量。定義結(jié)構(gòu)體變量有三種方法。方法1:先聲明結(jié)構(gòu)體類型,再定義變量。方法2:聲明結(jié)構(gòu)體類型的同時,定義變量。方法3:直接定義結(jié)構(gòu)體類型變量。方法1:先聲明結(jié)構(gòu)體類型,再定義變量。(最可取)例:先聲明結(jié)構(gòu)體類型
structStudent//24B{ intnum; charname[20];};
再定義變量
Studentstudent1,student2;
系統(tǒng)根據(jù)變量定義,分配內(nèi)存空間。
結(jié)構(gòu)體變量名
結(jié)構(gòu)體類型名方法2:聲明的同時定義變量
struct結(jié)構(gòu)體類型名{ 成員表列}結(jié)構(gòu)體變量名表列;例:
structStudent{ intnum; charname[20];}student1,s2,s3;方法3:直接定義變量(不可取)
struct{
成員表列}結(jié)構(gòu)體變量名表列;例:
struct{ intnum; charname[20];}student1,s2,s3;其它說明:不要誤認為但凡結(jié)構(gòu)體類型都有相同的結(jié)構(gòu)。例:structStudent//24B{ intnum; charname[20];};structStudent1//8B{ intnum; intage;};2)類型與變量不同①使用變量,不能使用類型。②編譯時,僅對變量分配內(nèi)存。例:
structDate{ intyear; intmonth; intday;}date1,date2;使用date1,date2//2*12B3)成員的引用相當(dāng)普通的變量(.成員運算符)例:
structS{ intnum; charname[20];}s1,s2;使用:
s1.num=20;strcpy(,"LiMing");s2.num=21;strcpy(,"ZhangHua");4)成員也可是結(jié)構(gòu)體變量例:structDate{ intmonth; intday; intyear;};structStudent{ intnum; charname[20]; charsex; intage; Datebirthday;charaddr[30];}student1,student2;student1,student2內(nèi)存分配分別為:4B+20B+1B+4B+3*4B+30B5)成員名和變量名相同,但不是一回事。例:
structStudent{ intnum; charname[20];}s1,s2;intnum;1)引用方式不同2)內(nèi)存空間不同
s1.num=20;num=20;2、結(jié)構(gòu)體變量的初始化定義時指定初始值例1:structStudent{ intnum; charname[20]; charsex; intage; floatscore; charaddr[30];}student1={10001,"ZhangXin",'M',19,90.5,"Shanghai"};例2:structStudent{ intnum; charname[20]; charsex; intage; floatscore; charaddr[30];};Studentstudent2={10002,"WangLi",'F',20,98,"Beijing"};
1、可以將一個結(jié)構(gòu)體變量的值賦給另一個具有相同結(jié)構(gòu)的結(jié)構(gòu)體變量。例:student1=student2;2、可以引用一個結(jié)構(gòu)體變量中的一個成員的值。引用結(jié)構(gòu)體變量中成員的一般方式為:結(jié)構(gòu)體變量名.成員名(.高級,自左向右,因此看成一個整體)例:student1.num=10010;
(一個整體)7.1.3結(jié)構(gòu)體變量的引用(使用)3、如果成員本身也是一個結(jié)構(gòu)體類型,那么要用假設(shè)干個成員運算符,一級一級地找到最低一級的成員。例:student1.num4、不能將一個結(jié)構(gòu)體變量作為一個整體進行輸入和輸出。例:cout<<student1;//錯誤只能對結(jié)構(gòu)體變量中的各個成員分別進行輸入和輸出。例:
cin>>student1.num;cout>>student1.num;5、對結(jié)構(gòu)體變量的成員可以像普通變量一樣進行各種運算(根據(jù)其類型決定可以進行的運算種類)。例:student2.score=student1.score;sum=student1.score+student2.score;student1.age++;++student1.age;注:由于"."運算符的優(yōu)先級高,因此student1.age++相當(dāng)于(student1.age)++。++是對student1.age進行自加運算,而不是先對age進行自加運算。(單獨的age是無意義的)6、可以引用結(jié)構(gòu)體變量成員的地址,也可以引用結(jié)構(gòu)體變量的地址。例:
cout<<&student1;cout<<&student1.age;
&student1:結(jié)構(gòu)體變量的地址&student1.age:結(jié)構(gòu)體變量成員的地址例7.1引用結(jié)構(gòu)體變量中的成員。#include<iostream>usingnamespacestd;structDate{ intmonth; intday; intyear;};structStudent{ intnum; charname[20]; charsex; Datebirthday; floatscore;}student1,student2={10002,"WangLi",'f',5,23,1982,89.5};
intmain(){ student1=student2; cout<<student1.num<<endl; cout<<<<endl; cout<<student1.sex<<endl; cout<<student1.birthday.month<<'/' <<student1.birthday.day<<'/' <<student1.birthday.year<<endl; cout<<student1.score<<endl; return0;}運行結(jié)果如下:10002WangLif5/23/198289.5定義結(jié)構(gòu)體數(shù)組的目的:
(一個結(jié)構(gòu)體變量只能存一組數(shù)據(jù)。如:一個學(xué)生的檔案,一個日期。)定義結(jié)構(gòu)體數(shù)組,可有多個元素,就可存放多個學(xué)生的檔案,多個日期。7.1.4結(jié)構(gòu)體數(shù)組1、定義結(jié)構(gòu)體數(shù)組三種方式:方式1:
structStudent{ intnum; charname[20]; charsex; intage; floatscore; charaddr[30];};Studentstu[3];方式2:structStudent{ intnum; charname[20]; charsex; intage; floatscore; charaddr[30];}stu[3];方式3:struct{ intnum; charname[20]; charsex; intage; floatscore; charaddr[30];}stu[3];2、結(jié)構(gòu)體數(shù)組的初始化方式:定義數(shù)組={初值表列};例:structStudent{ intnum; charname[20]; charsex; intage; floatscore; charaddr[30];}stu[3]={{10101,"LiLin",'M',18,87.5,"103BeijingRoad"},{10102,"ZhangFun",'M',19,99,"130ShanghaiRoad"},{10104,"WangMin",'F',20,78.5,"1010,ZhongshanRoad"}};數(shù)組各元素在內(nèi)存中連續(xù)存放。定義數(shù)組stu時,也可以不指定元素個數(shù)。即寫成以下形式:
structStudent{ intnum; charname[20]; charsex; intage; floatscore; charaddr[30];}stu[]={{10101,"LiLin",'M',18,87.5,"103BeijingRoad"},{10102,"ZhangFun",'M',19,99,"130ShanghaiRoad"},{10104,"WangMin",'F',20,78.5,"1010,ZhongshanRoad"}};3、結(jié)構(gòu)體數(shù)組應(yīng)用舉例例7.2對候選人得票的統(tǒng)計程序。(用字符數(shù)組)全局結(jié)構(gòu)體類型聲明:structPerson{ charname[20]; intcount;};定義結(jié)構(gòu)體變量并初始化:Personleader[3]={"Li",0,"Zhang",0,"Fun",0};統(tǒng)計得票:
for(i=0;i<10;i++){ cin>>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++){ cout<<leader[i].name<<":" <<leader[i].count<<endl;}運行:Zhang↙
Li↙Fun↙Li↙Zhang↙Li↙Zhang↙Li↙Fun↙Wang↙Li:4Zhang:3Fun:2修改程序:(用字符串變量)全局結(jié)構(gòu)體類型聲明:
structPerson{
stringname;
intcount;};定義結(jié)構(gòu)體變量,但不能初始化:Personleader[3];for(i=0;i<3;i++){ cin>>leader[i].name;
leader[i].count=0;}
stringleader_name;統(tǒng)計得票:
for(i=0;i<10;i++){ cin>>leader_name; for(j=0;j<3;j++) if(leader_name==leader[j].name) leader[j].count++;}輸出得票:for(i=0;i<3;i++){ cout<<leader[i].name<<":" <<leader[i].count<<endl;}小結(jié)1、聲明結(jié)構(gòu)體類型
structA1{ inta; charb;};2、定義結(jié)構(gòu)體變量(三種方式)
A1c;3、引用(使用)結(jié)構(gòu)體變量成員
c.a=10;c.b='a';cin>>c.a>>c.b;cout<<c.a<<c.b;4、結(jié)構(gòu)體變量初始化
A1c1={20,'b'};5、特例使用:c=c1;小結(jié)6、結(jié)構(gòu)體數(shù)組1)聲明類型
structA1{ inta; charb;};2)聲明結(jié)構(gòu)體數(shù)組(三種方式)
A1a[20];3)引用(使用)結(jié)構(gòu)體數(shù)組元素的成員
a[i].a=10;a[i].b='a';cin>>a[i].a>>a[i].b;4)結(jié)構(gòu)體數(shù)組初始化A1a[2]={10,'a',11,'b'};1、通過指向結(jié)構(gòu)體變量的指針引用結(jié)構(gòu)體變量中的成員1)指向結(jié)構(gòu)體變量指針變量的定義前提:需聲明結(jié)構(gòu)體類型例:structStudent{ longnum; charname[20];};定義:結(jié)構(gòu)體類型名*變量名;例:Student*p;7.1.5指向結(jié)構(gòu)體變量的指針2)賦初值
Studentstudent1;Student*p;p=&student1;(指向確定)3)引用成員
student1.num=98001(*p).num=98001注意:括號不能省略。4)指向運算符->
(*p).num=98001可改寫為
p->num=98001優(yōu)先級高級結(jié)合性自左向右
p->num(可看成一個整體)p->num++++p->num5)結(jié)構(gòu)體成員的三種表示方法直接訪問:
student1.num
間接訪問:(*p).nump->num(少寫兩個字符,更直觀)例7.3指向結(jié)構(gòu)體變量的指針的應(yīng)用。結(jié)構(gòu)體類型局部聲明:structStudent{ intnum; stringname; charsex; floatscore;};結(jié)構(gòu)體變量聲明:Studentstu;指向結(jié)構(gòu)體變量的指針變量定義和初始化:Student*p=&stu;輸出成員值:(三種方式)cout<<stu.num<<""<<<<""<<stu.sex<<""<<stu.score<<endl;cout<<(*p).num<<""<<(*p).name<<""<<(*p).sex<<""<<(*p).score<<endl;cout<<p->num<<""<<p->name<<""<<p->sex<<""<<p->score<<endl;2、用結(jié)構(gòu)體變量和指向結(jié)構(gòu)體變量的指針構(gòu)成鏈表鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)。圖7.8表示最簡單的一種鏈表(單向鏈表)的結(jié)構(gòu)。圖7.8鏈表有一個"頭指針"變量,圖中以head表示,它存放一個地址。該地址指向第一個元素。鏈表中的每一個元素稱為"結(jié)點"。每個結(jié)點都應(yīng)包括兩個局部:一是用戶需要用的實際數(shù)據(jù),二是下一個結(jié)點的地址。1)鏈表---根據(jù)需要開辟內(nèi)存單向鏈表:1)頭指針head:
存放鏈表的首地址2)結(jié)點:鏈表中每一個元素
part1:用戶的實際數(shù)據(jù)
part2:下一結(jié)點的首地址3)表尾:最后一個結(jié)點
part1:用戶的實際數(shù)據(jù)
part2:存放空地址
(NULL)2)3人鏈表a)31001,89.5b)31003,90c)31007,85
Student*next;
Student*head;例:structStudent{ longnum; floatscore;};1)2人鏈表a)31001,89.5b)31003,90。鏈表結(jié)點的結(jié)構(gòu)體類型:
structStudent{longnum;floatscore;Student*next;};鏈表的表頭:
Student*head;
Part1
Part2NULL例7.4建立簡單鏈表,它由3個學(xué)生數(shù)據(jù)的結(jié)點組成。輸出各結(jié)點中的數(shù)據(jù)。(靜態(tài)鏈表)#defineNULL0//注意此行#include<iostream>structStudent{ longnum; floatscore; Student*next;};(全局結(jié)構(gòu)體類型聲明)intmain(){ Studenta,b,c,*head,*p;
a.num=31001;a.score=89.5; b.num=31003;b.score=90; c.num=31007;c.score=85;
head=&a; a.next=&b; b.next=&c; c.next=NULL; p=head; do { cout<<p->num<<""<<p->score<<endl; p=p->next; }while(p!=NULL); return0;}將一個結(jié)構(gòu)體變量中的數(shù)據(jù)傳遞給另一個函數(shù),有以下3種方法:用結(jié)構(gòu)體變量名作參數(shù)。一般較少用這種方法。(傳值調(diào)用,單向,不共占內(nèi)存)(2)用指向結(jié)構(gòu)體變量的指針作實參,將結(jié)構(gòu)體變量的地址傳給形參。(傳值調(diào)用)〔常用〕要求:函數(shù)體內(nèi)改變指向變量值(3)用結(jié)構(gòu)體變量的引用(別名)作函數(shù)參數(shù)。(傳址調(diào)用)共占內(nèi)存(最可取)7.1.6結(jié)構(gòu)體類型數(shù)據(jù)作為函數(shù)參數(shù)例7.5有一個結(jié)構(gòu)體變量stu,內(nèi)含學(xué)生學(xué)號、姓名和3門課的成績。要求在main函數(shù)中為各成員賦值,在另一函數(shù)print中將它們的值輸出。用結(jié)構(gòu)體變量作函數(shù)參數(shù)(傳值調(diào)用)(傳值調(diào)用,單向,不共占內(nèi)存)函數(shù)聲明:voidprint(Student);函數(shù)調(diào)用:print(stu);函數(shù)定義:voidprint(Studentstu){ cout<<stu.num……;//成員運算符}實參stu和形參stu各占內(nèi)存。傳遞的是整個結(jié)構(gòu)體成員值。改變形參,結(jié)果不返回。2)用指向結(jié)構(gòu)體變量的指針作形參(傳值調(diào)用)函數(shù)聲明:voidprint(Student*);函數(shù)調(diào)用:print(&stu);
或Student*pt;pt=&stu;print(pt);//不共占內(nèi)存函數(shù)定義://要求:改變指向變量的值,結(jié)果返回。voidprint(Student*p){ cout<<p->num……;//指向運算符}形參p指向?qū)崊tu。傳遞的是結(jié)構(gòu)體變量stu首地址。3)用結(jié)構(gòu)體變量的引用(別名)作函數(shù)參數(shù)(傳址調(diào)用)函數(shù)聲明:voidprint(Student&);函數(shù)調(diào)用:print(stu);函數(shù)定義:改變引用成員的值,結(jié)果返回。voidprint(Student&stud){ cout<<stud.num……;//成員運算符}形參stud是實參stu的別名,共占內(nèi)存。傳遞的是結(jié)構(gòu)體的首地址。在軟件開發(fā)過程中,常常需要動態(tài)地分配和撤銷內(nèi)存空間,例如對動態(tài)鏈表中結(jié)點的插入與刪除。C++提供了較簡便而功能較強的運算符new和delete。注意:new和delete是運算符。(優(yōu)先級和結(jié)合性)new:動態(tài)分配內(nèi)存空間delete:撤銷(釋放)內(nèi)存空間*7.1.7動態(tài)分配和撤銷內(nèi)存的運算符new和delete1、new運算符使用的一般格式為:new類型[(初值)](該中括號表示可選項)例1:newint;作用:開辟一個存放整數(shù)的存儲空間,返回一個指向該存儲空間的地址(即指針)。注意:1)用new分配數(shù)組空間時不能指定初值。2)如果由于內(nèi)存缺乏等原因而無法正常分配空間,那么new會返回一個空指針NULL,用戶可以根據(jù)該指針的值判斷分配空間是否成功。例2:newint(100);作用:開辟一個存放整數(shù)的空間,并指定該整數(shù)的初值為100,返回一個指向該存儲空間的地址。
(注意:沒有賦給變量,下面的例子也是如此)例3:newchar[10];作用:開辟一個存放字符數(shù)組(包括10個元素)的空間,返回首元素的地址。
例4:
newint[5][4];作用:開辟一個存放二維整型數(shù)組(大小為5*4)的空間,返回首元素的地址。例5:
float*p=newfloat(3.14159);作用:開辟一個存放單精度數(shù)的空間,并指定該實數(shù)的初值為3.14159,將返回的該空間的地址賦給指針變量p。2、delete運算符使用的一般格式為delete[]指針變量1)前提:必須有指針變量指向new開辟的內(nèi)存空間,才可用delete釋放。例:newint;開辟了,卻不能釋放。2)注意:此處中括號為釋放動態(tài)數(shù)組空間需要的。例1:float*p=newfloat(3.14159);
deletep;作用:釋放上面用new開辟的存放單精度數(shù)的空間。例2:char*pt=newchar[10];delete[]pt;
作用:在指針變量前面加一對方括號,表示是對數(shù)組空間的釋放操作。例7.6開辟空間以存放一個結(jié)構(gòu)體變量。全局聲明結(jié)構(gòu)體類型:structStudent{ stringname; intnum; charsex;};定義結(jié)構(gòu)體類型指針變量:Student*p;//第一步,定義指針開辟動態(tài)內(nèi)存:p=newStudent;//第二步,指向確定操作數(shù)據(jù):p->name="WangFun";cout<<p->name;//第三步,使用指向成員釋放內(nèi)存:deletep;
修改例7.4開辟空間以存放一個動態(tài)鏈表〔下學(xué)期學(xué)習(xí)〕〔考試不考〕#include<iostream>usingnamespacestd;#defineNULL0structStudent{ intnum; doublescore; Student*next;};voidmain(){ Student*head,*p,*p1; p1=newStudent; p1->num=31001;p1->score=89.5; head=p1; p=p1; p1=newStudent; p1->num=31003;p1->score=90; p->next=p1; p=p1; p1=newStudent; p1->num=31005;p1->score=85; p->next=p1; p1->next=NULL; p=head; while(p!=NULL) { cout<<p->num<<""<<p->score<<endl; p=p->next; } }小結(jié)1、結(jié)構(gòu)體指針1)聲明類型//前提
structA1{ inta; charb;};2)聲明結(jié)構(gòu)體變量和指針變量//第一步
A1a,*p;3)指針變量賦值,指向確定//第二步
p=&a;4)使用指向變量的成員:p->a=10;p->b='C';//第三步問:a.a對還是錯?小結(jié)2、靜態(tài)鏈表〔非動態(tài)內(nèi)存〕1)鏈表結(jié)點類型聲明structA1{ inta; charb; A1*next;};A1*head;2)聲明鏈表結(jié)點變量A1a,b;3)a,b構(gòu)成鏈
head=&a;a.next=&b;b.next=NULL;4)鏈輸出(結(jié)點循環(huán))
A1*p;p=head;while(p!=NULL){cout<<p->a<<p->b<<endl;p=p->next;}小結(jié)3、結(jié)構(gòu)體作函參1)形參:結(jié)構(gòu)體變量定義〔函數(shù)體內(nèi)使用成員運算符.〕實參:結(jié)構(gòu)體變量(已經(jīng)有值〕所有成員傳值,不共占內(nèi)存,結(jié)果不能返回。2)形參:結(jié)構(gòu)體指針定義(函數(shù)內(nèi)使用->運算符)實參:&結(jié)構(gòu)體變量(結(jié)構(gòu)體首地址)(已經(jīng)有值〕傳值,不共占內(nèi)存,有要求:函數(shù)體內(nèi)改變指向變量值改變的是實參成員,結(jié)果能返回。3)形參:結(jié)構(gòu)體別名(引用)定義(函數(shù)內(nèi)使用別名和成員運算符.)實參:結(jié)構(gòu)體變量(已經(jīng)有值〕傳址,共占內(nèi)存。改變實參內(nèi)存空間,結(jié)果能返回。小結(jié)4、new和delete1)int*p;p=newint;cin>>*p;cout<<*p;deletep;float*p;p=newfloat(1.2);cout<<*p;deletep;char*p;p=newchar[10];p=“abcd〞;或者cin>>p;delete[]p;小結(jié):〔重要〕5、開辟釋放結(jié)構(gòu)體動態(tài)內(nèi)存1〕結(jié)構(gòu)體類型:structStudent{ stringname; intnum; charsex;};2〕定義結(jié)構(gòu)體類型指針變量:Student*p;//第一步,定義指針3〕開辟動態(tài)內(nèi)存:p=newStudent;//第二步,指向確定4〕操作數(shù)據(jù):p->name="WangFun";cout<<p->name;//第三步,使用指向成員5〕釋放內(nèi)存:deletep;問:p內(nèi)存何時釋放?小結(jié):〔重要〕6、開辟釋放鏈表結(jié)點動態(tài)內(nèi)存1〕鏈表結(jié)點類型:structStudent{ stringname; intnum; Student*next;};2〕定義結(jié)構(gòu)體類型指針變量:Student*head;//第一步,定義指針3〕開辟動態(tài)內(nèi)存:head=newStudent;//第二步,指向確定4〕操作數(shù)據(jù): head->name="WangFun";cout<<head->name;//第三步,使用指向成員5〕釋放內(nèi)存:deletehead;namenumnexthead問:head內(nèi)存何時釋放?小結(jié)變量第一次賦值的方法:1〕初始化〔聲明局部〕inta1=3;inta2[]={1,2};charc1='a';charc2[]="ab";char*c3="ab";stringstr="ab";int*p=&a;2〕賦值語句賦初值〔執(zhí)行局部〕正確:a1=4;a2[0]=1;a2[1]=2;錯誤:a2[]={1,2};正確:c1='a';c2[0]='a';c2[1]='b';strcpy(c2,"ab"); c3="ab"; 錯誤:c2[]="ab";c2="ab";正確:str="ab";p=&a;3〕cin輸入〔執(zhí)行局部〕小結(jié)錯誤的情況1〕初始化〔聲明局部〕structStudent {stringname; intnum; }s={"Li",1001};//錯誤2〕賦值語句賦初值〔執(zhí)行局部〕charc2[80];c2="ab";c2[]="ab";c2[80]="ab";//錯誤正確:strcpy(c2,"ab");3〕cin輸入〔執(zhí)行局部〕char*c;cin>>c;//錯誤糾錯:structStudent {stringname; intnum; }; ="Li";//或者cin s.num=1001;//或者cin正確:charc1[80],*c; c=c1;cin>>c;練習(xí):1、以下正確的單向鏈表結(jié)點的類型定義是:______。A〕structStudent{stringname;intnum;};B〕structStudent{stringname;intnum;int*next;};答案:DC〕structStudent{stringname;intnum;Studentnext;};D〕structStudent{stringname;intnum;Student*next;};練習(xí):2、以下程序運行結(jié)果。#include<iostream>#include<string>usingnamespacestd;structStudent{intnum;stringname;};voidmain(){ voidfun1(Student); Studentstu; stu.num=1001; ="Li"; fun1(stu); cout<<stu.num <<<<endl;}voidfun1(Studentstu){ stu.num=1002; ="Wang";}運行結(jié)果:1001Li練習(xí):3、以下程序運行結(jié)果。#include<iostream>#include<cstring>usingnamespacestd;structStudent{intnum;charname[80];};voidmain(){ voidfun1(Student*); Studentstu; stu.num=1001;
strcpy(,"Li"); fun1(&stu); cout<<stu.num<<<<endl;}voidfun1(Student*stu){
stu->num=1002;
strcpy(stu->name,"Wang");}運行結(jié)果:1002Wang練習(xí):4、以下程序運行結(jié)果。#include<iostream>#include<cstring>usingnamespacestd;structStudent{intnum;charname[80];};voidmain(){ voidfun1(Student&); Studentstu; stu.num=1001; strcpy(,"Li"); fun1(stu); cout<<stu.num<<<<endl;}voidfun1(Student&stu){
stu.num=1002; strcpy(,"Wang");}運行結(jié)果:1002Wang練習(xí):5、結(jié)構(gòu)體類型定義如下: structStudent{stringname;intnum;};以下正確的開辟釋放結(jié)構(gòu)體動態(tài)內(nèi)存的是:______。A〕newStudent;deleteStudent;B〕Student*p;newStudent;deletep;答案:DC〕Student*p;p=newStudent;delete[]p;D〕Student*p;p=newStudent;deletep;1、有時需要使幾種不同類型的變量存放到同一段內(nèi)存單元中。例:可把一個整型變量、一個字符型變量、一個雙精度型變量放在同一個地址開始的內(nèi)存單元中。7.2共用體
7.2.1共用體的概念2、這種使幾個不同的變量共占同一段內(nèi)存的結(jié)構(gòu),稱為共用體(union)類型的結(jié)構(gòu)(或聯(lián)合類型)。3、聲明共用體類型的一般形式為:union共用體類型名{ 成員表列};例:uniondata{inti;charch;doubled;};4、定義共用體變量的一般形式為:共用體類型名共用體變量名;
dataa,b,c;(另外兩種方式)uniondata{inti;charch;doubled;}a,b,c;
(有共用體類型名)union{inti;charch;doubled;}a,b,c;(無共用體類型名)5、共用體變量所占的內(nèi)存長度等于最長的成員的長度。例:uniondata{inti;charch;doubled;}a,b,c;
(共用體變量a:8B)structdata{inti;charch;doubled;}a,b,c;(結(jié)構(gòu)體變量a:13B)1、不能引用共用體變量,而只能引用共用體變量中的成員。例:正確引用
a.ia.cha.fcout<<a.i;2、不能只引用共用體變量。例:錯誤引用
cout<<a;7.2.2對共用體變量的訪問方式1)使用共用體變量的目的:是希望用同一個內(nèi)存段存放幾種不同類型的數(shù)據(jù)。注意:在每一瞬時只能存放其中一種,而不是同時存放幾種。2)能夠訪問的是共用體變量中最后一次被賦值的成員,在對一個新的成員賦值后原有的成員就失去作用。3)共用體變量的地址和它的各成員的地址都是同一地址。4)不能對共用體變量名賦值;不能企圖引用共用體變量名來得到一個值;不能在定義共用體變量時對它初始化;不能用共用體變量名作為函數(shù)參數(shù)。7.2.3共用體類型數(shù)據(jù)的特點例7.7設(shè)有假設(shè)干個人員的數(shù)據(jù),其中有學(xué)生和教師。學(xué)生的數(shù)據(jù)中包括:姓名、號碼、性別、職業(yè)、年級。教師的數(shù)據(jù)包括:姓名、號碼、性別、職業(yè)、職務(wù)??梢钥闯?學(xué)生和教師所包含的數(shù)據(jù)是不同的?,F(xiàn)要求把它們放在同一表格中,見圖7.13。圖7.13全局結(jié)構(gòu)體類型和變量聲明:
其中一成員為共用體類型和變量的聲明;struct{ intnum; charname[10]; charsex; charjob; unionP { intgrade; charposition[10]; }category;}person[2];也可以這樣聲明:(好的聲明)先聲明共同體類型,再全局聲明結(jié)構(gòu)體類型和變量。unionP{ intgrade; charposition[10];};structData{ intnum; charname[10]; charsex; charjob; Pcategory;};Dataperson[2];if(person[i].job=='s')cin>>person[i].category.grade;elseif(person[i].job=='t')cin>>person[i].category.position;——————————if(person[i].job=='s')cout<<person[i].num<<setw(6)<<person[i].name<<""<<person[i].sex<<""<<person[i].job<<setw(10)<<person[i].category.grade<<endl;elsecout<<person[i].num<<setw(6)<<person[i].name<<""<<person[i].sex<<""<<person[i].job<<setw(10)<<person[i].category.position<<endl;小結(jié):1、共同體類型和變量及使用成員1)聲明共同體類型,共同體成員共占內(nèi)存unionA1{ inta; charb;};//問:cout<<sizeof(A1);2〕定義共同體變量(三種方式)A1c;3)只能引用(使用)共同體變量的某一個成員c.a=10;cin>>c.a;cout<<c.a;或c.b='a';cin>>c.b;cout<<c.b;1、如果一個變量只有幾種可能的值,可以定義為枚舉(enumeration)類型。2、所謂"枚舉"是指將變量的值一一列舉出來,變量的值只能在列舉出來的值的范圍內(nèi)。7.3枚舉類型〔不考〕3、聲明枚舉類型的一般形式為:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《月有陰晴圓缺》課件
- 2025年信陽藝術(shù)職業(yè)學(xué)院馬克思主義基本原理概論期末考試模擬題及答案解析(奪冠)
- 2025年上思縣招教考試備考題庫帶答案解析(必刷)
- 2024年鄂城鋼鐵廠職工大學(xué)馬克思主義基本原理概論期末考試題帶答案解析
- 2024年聶榮縣幼兒園教師招教考試備考題庫帶答案解析
- 2025年會同縣幼兒園教師招教考試備考題庫帶答案解析
- 2025年和平縣幼兒園教師招教考試備考題庫帶答案解析(必刷)
- 2024年縉云縣幼兒園教師招教考試備考題庫附答案解析(奪冠)
- 2025年唐縣幼兒園教師招教考試備考題庫含答案解析(奪冠)
- 保山市2025-2026學(xué)年(上期)高三期末考試歷史試卷(含答案解析)
- 2025年時事政治考試100題(含參考答案)
- 部隊禁酒課件
- 2025-2030年中國油套管產(chǎn)業(yè)規(guī)模分析及發(fā)展前景研究報告
- DB11-T 1811-2020 廚房、廁浴間防水技術(shù)規(guī)程
- 叉車安全管理人員崗位職責(zé)
- 驗光師年度工作總結(jié)
- 2024年浙江溫州市蒼南縣公投集團所屬企業(yè)招聘筆試人員及管理單位遴選500模擬題附帶答案詳解
- 新生兒先天性心臟病篩查課件
- 景區(qū)與熱氣球合作合同范本
- 水庫除險加固工程施工組織設(shè)計
- DL∕T 5210.5-2018 電力建設(shè)施工質(zhì)量驗收規(guī)程 第5部分:焊接
評論
0/150
提交評論