C語言各章節(jié)單元測(cè)試題及答案-結(jié)構(gòu)體與共用體_第1頁
C語言各章節(jié)單元測(cè)試題及答案-結(jié)構(gòu)體與共用體_第2頁
C語言各章節(jié)單元測(cè)試題及答案-結(jié)構(gòu)體與共用體_第3頁
C語言各章節(jié)單元測(cè)試題及答案-結(jié)構(gòu)體與共用體_第4頁
C語言各章節(jié)單元測(cè)試題及答案-結(jié)構(gòu)體與共用體_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第9章結(jié)構(gòu)體與共用體9.1典型考試題剖析9.1.1選擇題【例1】若指針p已經(jīng)正確定義,要使p指向兩個(gè)連續(xù)的整型動(dòng)態(tài)存儲(chǔ)單元,不正確的語句是。A)p=2*(int*)malloc(sizeof(int));B)p=(int*)malloc(2*sizeof(int));C)p=(int*)malloc(2*2);D)p=(int*)calloc(2,sizeof(int));

考點(diǎn):動(dòng)態(tài)存儲(chǔ)分配函數(shù)。

分析:根據(jù)動(dòng)態(tài)存儲(chǔ)分配函數(shù)malloc和calloc的函數(shù)原型可以知道,calloc函數(shù)的調(diào)用形式為:void*calloc(unsignedn,unsignedsize);表示在動(dòng)態(tài)存儲(chǔ)區(qū)中分配n個(gè)長(zhǎng)度為size的連續(xù)空間,函數(shù)返回一個(gè)指向分配域起始地址的指針,因此答案D是正確的。malloc函數(shù)的調(diào)用形式為:void*malloc(unsignedintsize);表示是在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)分配一個(gè)長(zhǎng)度為size的連續(xù)空間,并返回一個(gè)指向分配域起始地址的指針,答案B和C中malloc的參數(shù)分別為:2*(sizeof(int))和2*2,都是整型數(shù),因此調(diào)用形式正確。答案A中(int*)malloc(sizeof(int))的返回值為一個(gè)地址值,將地址的值乘以2是沒有意義的。

答案:A【例2】若有以下說明和定義:structtest{intm1;charm2;floatm3;unionuu{charu1[5];intu2[2];}ua;}myaa;則sizeof(structtest)的值是。A)12B)16C)14D)9

考點(diǎn):結(jié)構(gòu)體類型和共用體類型所占內(nèi)存的字節(jié)數(shù)。

分析:sizeof(structtest)的功能是求結(jié)構(gòu)體類型test所占用的內(nèi)存字節(jié)數(shù)。它應(yīng)該等于結(jié)構(gòu)體每個(gè)成員所占的字節(jié)數(shù)之和。m1為int型,占2字節(jié),m2為char型,占1字節(jié),m3為float型,占4字節(jié),接下來是一個(gè)共用體類型uu,共用體所占的字節(jié)數(shù)應(yīng)該等于成員中最長(zhǎng)者所占的字節(jié)數(shù),u1占5字節(jié),u2占4字節(jié),那么該共用體類型應(yīng)該占用5字節(jié),所以2+1+4+5=12。

答案:A【例3】若有以下定義:structlink{intdata;structlink*next;}a,b,c,*p,*q;且變量a和b之間已經(jīng)有如右圖所示的鏈表結(jié)構(gòu):指針p指向變量a,q指向變量c。能夠把c插到a和b之間,并形成新的鏈表的語句組是。A)a.next=c;c.next=b;B)p.next=q;q.next=p.next;C)p->next=&c;q->next=p->next;D)(*p).next=q;(*q).next=&b;

考點(diǎn):向鏈表插入結(jié)點(diǎn)。

分析:答案A中,a.next是一個(gè)指針變量,而c是一個(gè)結(jié)構(gòu)體變量,二者不能互相賦值。答案B錯(cuò)誤在于p和q都是指針變量,引用時(shí)只有p->next或(*p).next兩種形式才是正確的。答案C中的第一句將變量a的next指針指向了變量c,但是第二句卻沒有將c的next指針指向b,而是指向c本身。答案D是先把結(jié)構(gòu)體變量a的next指針指向c,再使c的next指針指向b。

答案:D【例4】設(shè)有以下說明語句:typedefstruct{intn;charch[8];}per;則下面敘述正確的是。A)per是結(jié)構(gòu)體變量名B)per是結(jié)構(gòu)體類型名C)typedef是結(jié)構(gòu)體類型D)struct是結(jié)構(gòu)體類型名

考點(diǎn):用typedef定義新類型。

分析:根據(jù)概念,typedef的作用是聲明新的類型名來代替已有的類型名,因此只有答案B是正確的。

答案:B【例5】有以下程序:structstu{char[10];floatscore[3];};main(){structstus[3]={{"20021",90,95,85},{"20022",95,80,75},{"20023",100,95,90}},*p=s;inti;floatsum=0;for(i=0;i<3;i++)sum=sum+p->score[i];printf("%6.2f\n",sum);}程序運(yùn)行后的輸出結(jié)果是。A)260.00B)270.00C)280.00D)285.00

考點(diǎn):結(jié)構(gòu)體變量成員的引用。

分析:本題中,s為一個(gè)結(jié)構(gòu)體數(shù)組,p為結(jié)構(gòu)體指針。語句p=s使p指向數(shù)組s的第一個(gè)元素即s[0]。for循環(huán)的作用是將p所指向的單元累加到變量sum中,作用相當(dāng)于相當(dāng)于語句s[0].score[0]+s[0].score[1]+s[0].score[2]。

答案:B【例6】有以下程序#include<stdlib.h>structnode{intnum;structnode*next;};main(){structnode*p,*q,*r;p=(structnode*)malloc(sizeof(structnode));q=(structnode*)malloc(sizeof(structnode));r=(structnode*)malloc(sizeof(structnode));p->num=10;q->num=20;r->num=30;p->next=q;q->next=r;printf("%d\n",p->num+p->next->num);}程序運(yùn)行后的輸出結(jié)果是。A)10B)20C)30D)40

考點(diǎn):指向結(jié)構(gòu)體變量的指針和結(jié)構(gòu)體成員引用。

分析:程序中建立了一個(gè)鏈表,含有三個(gè)結(jié)點(diǎn)p、q、r,語句p->next=q;q->next=r;將三個(gè)結(jié)點(diǎn)連接起來,如圖所示。

答案:D【例7】下面程序的輸出結(jié)果為。#include<stdio.h>main(){structst{intx;unsigneda:2;unsignedb:2;}st1,st2;printf("\n%d",sizeof(structst));}A)2.5B)3C)2D)不確定

考點(diǎn):位段有關(guān)知識(shí)。

分析:在本例中涉及到位段定義的知識(shí)。位段又稱位域或位字段,此種定義可以使若干個(gè)結(jié)構(gòu)體成員共用一個(gè)或幾個(gè)字節(jié),其中每個(gè)成員占用若干二進(jìn)制位。位段定義和普通結(jié)構(gòu)體定義類似,只是每個(gè)成員附加二進(jìn)制位數(shù)說明,如:structstru{unsigneda:2;unsignedb:4;unsigned:0;unsignedd:2;};其中位數(shù)為0的無名字段的含義是跳過該字節(jié)剩余的位不用,所以上述中stru所占的字節(jié)數(shù)為2。注意:位域成員通常沒有獨(dú)立的存儲(chǔ)單元,因此諸如&st1.a,&st2.b之類對(duì)位域成員取地址的運(yùn)算是非法的。另外,位域成員只能是int或unsigned類型,其它類型都是非法的,而且位域成員也不能排成數(shù)組,如:unsignedc[2]:2是錯(cuò)誤的。本例中,a和b各占用2個(gè)二進(jìn)制位,不夠一個(gè)字節(jié),系統(tǒng)將邊界調(diào)整為整數(shù),加上int型變量x占用的2個(gè)字節(jié),共占用3字節(jié)。

答案:B【例8】下述程序的執(zhí)行結(jié)果是。#include<stdio.h>unionun{inti;charc[2];};voidmain(){unionunx;x.c[0]=10;x.c[1]=1;printf("\n%d",x.i);}A)266B)11C)265D)138

考點(diǎn):本例考察的是共用體的特性。

分析:int型變量i和字符數(shù)組c共用2個(gè)字節(jié)的存儲(chǔ)單元,通常c[0]位于低字節(jié),c[1]位于高字節(jié)。因此,x.i=x.c[1]*256+c[0]=266,正確答案為A。通過本例我們知道,共用體可以實(shí)現(xiàn)將一個(gè)數(shù)據(jù)的各個(gè)字節(jié)拆分出來單獨(dú)使用。

答案:A【例9】下面程序的輸出是。main(){enumteam{my,your=4,his,her=his+10};printf("%d%d%d%d\n",my,your,his,her);}A)0123B)04010C)04515D)14515

考點(diǎn):枚舉類型數(shù)據(jù)的性質(zhì)。

分析:枚舉類型定義后的枚舉元素表中的元素值排列順序依次為0,1,2…,若其中某一元素給定初值,則其后的元素值依次遞增。

答案:C【例10】以下對(duì)枚舉類型名的定義中正確的是。A)enuma={one,two,three};B)enuma{one=9,two=-1,three};C)enuma={"one","two","three"};D)enuma{"one","two","three"};

考點(diǎn):枚舉類型的定義。

分析:根據(jù)枚舉類型的定義形式知道,只有答案B的形式是正確的。

答案:B9.1.2填空題【例1】下面程序的運(yùn)行結(jié)果為。typedefunionstudent{charname[10];longsno;charsex;floatscore[4];}stu;main(){stua[5];printf("%d\n",sizeof(a));}

考點(diǎn):結(jié)構(gòu)體變量所占內(nèi)存的長(zhǎng)度。

分析:本題中a是一個(gè)共用體數(shù)組,題目最終要求出數(shù)組a所占的內(nèi)存字節(jié)數(shù),由于數(shù)組a包含5個(gè)元素,因此它所占的內(nèi)存字節(jié)數(shù)為:每個(gè)元素所占的字節(jié)數(shù)*5。而每個(gè)元素都是共用體類型變量,它們的長(zhǎng)度等于分量中長(zhǎng)度最長(zhǎng)的變量,顯然score數(shù)組占16字節(jié)是最長(zhǎng)的。因此該題的結(jié)果為:16*5=80。

答案:80【例2】以下程序完成鏈表的輸出,請(qǐng)?zhí)羁?。voidprint(head)structstu*head;{structstu*p;p=head;if(【1】)do{printf("%d,%f\n",p->num,p->score);p=p->next;}while(【2】);}

考點(diǎn):鏈表操作。

分析:p是指向鏈表結(jié)點(diǎn)的指針變量,輸出過程中每輸出一個(gè)結(jié)點(diǎn)的內(nèi)容之后,就向后移動(dòng)一個(gè)位置,當(dāng)p指向NULL時(shí)輸出結(jié)束,兩處空白處均為判斷鏈表是否結(jié)束的語句,其中第一空判斷鏈表是否為空表。

答案:【1】p!=NULL【2】p!=NULL【例3】已知指針變量head指向單鏈表表頭,下面程序用來統(tǒng)計(jì)鏈表中各個(gè)結(jié)點(diǎn)的數(shù)據(jù)項(xiàng)之和,請(qǐng)?zhí)羁铡tructlink{intdata;structlink*next;};main(){intk;structlink*head;k=sum(head);printf("%d\n",k);}sum(【1】){structlink*p;ints;s=head->data;p=head->next;while(p){s+=【2】;p=p->next;}return(s);}

考點(diǎn):鏈表操作。

分析:求和函數(shù)sum的形參應(yīng)該接收實(shí)參傳過來的單向鏈表頭結(jié)點(diǎn)的地址,所以應(yīng)該為一個(gè)指針變量,求和語句應(yīng)該填入的是用指針變量p引用結(jié)構(gòu)體的數(shù)據(jù)成員。

答案:【1】structlink*head【2】p->data或(*p).data【例4】下面程序的輸出結(jié)果是。main(){enumabc{green=3,red};char*clr[]={"red","blue","yellow","black","white","green"};printf("%sand",clr[green]);printf("%s",clr[red]);}

考點(diǎn):枚舉類型數(shù)據(jù)。

分析:字符型指針數(shù)組clr中存放的是6個(gè)字符串的首地址,因枚舉元素是常量,所以printf語句中的輸出項(xiàng)clr[green]、clr[red]就是clr[3]、clr[4]即"black"和"white"的首地址。

答案:blackandwhite9.2自測(cè)練習(xí)與參考答案9.2.1選擇題1.有以下定義和語句:structstudent{intage;intnum;};structstudentstu[3]={{1001,20},{1002,19},{1003,21}};main(){structstudent*p;p=stu;……}則以下不正確的引用是。A)(p++)->numB)p++C)(*p).numD)p=&stu.age2.有以下結(jié)構(gòu)體定義:structexample{intx;inty;}v1;則正確的引用或定義是。A)example.x=10B)examplev2;v2.x=10;C)structv2;v2.x=10;D)structexamplev2={10};3.對(duì)于如下結(jié)構(gòu)體定義,若對(duì)變量person的出生年份進(jìn)行賦值,正確的賦值是。structdate{intyear,month,day;};structworklist{charname[20];charsex;structdatebirth;}person;A)year=1976B)birth.year=1976C)person.birth.year=1976D)person.year=19764.根據(jù)下述定義,可以輸出字符'A'的語句是。structperson{charname[11];struct{charname[11];intage;}other[10];};structpersonman[10]={{"Jone",{"Paul",20}},{"Paul",{"Mary",18}},{"Mary",{"Adam",23}},{"Adam",{"Jone",22}}};A)printf("%c",man[2].other[0].name[0]);B)printf("%c",other[0].name[0]);C)printf("%c",man[2].(*other[0]));D)printf("%c",man[3].name);5.若有以下程序段:structst{intn;structst*next;};structsta[3]={5,&a[1],7,&a[2],9,'\0'},*p=a;則值為6的表達(dá)式為。A)p++->nB)p->n++C)(*p).n++D)++p->n6.對(duì)于以下定義,不正確的敘述是。uniondata{inti;charc;floatf;}a,b;A)變量a所占的內(nèi)存長(zhǎng)度等于成員f的長(zhǎng)度B)變量a的地址和它的各成員地址都是相同的C)不能對(duì)變量a賦初值D)可以在定義的時(shí)候?qū)初始化7.下述程序運(yùn)行結(jié)果為。#include<stdio.h>structst{intn;int*m;}*p;voidmain(){intd[5]={10,20,30,40,50};structstarr[5]={100,d,200,d+1,300,d+2,400,d+3,500,d+4};p=arr;printf("%d\t",++p->n);printf("%d\t",(++p)->n);printf("%d\n",++(*p->m));}A)10120021B)1012030C)20010121D)101101108.以下程序的運(yùn)行結(jié)構(gòu)是。#include<stdio.h>main(){union{longa;intb;charc;}m;printf("%d\n",sizeof(m));}A)2B)4C)6D)79.若要利用下面的程序段使指針變量p指向一個(gè)存儲(chǔ)整型變量的存儲(chǔ)單元,則在空格中應(yīng)填入的內(nèi)容是。int*p;p=malloc(sizeof(int));A)intB)int*C)(*int)D)(int*)10.執(zhí)行下述語句后的結(jié)果是。enumweekday{sun,mon=3,tue,wed,thu};enumweekdayday;day=wed;printf("%d\n",day);A)5B)3C)4D)編譯時(shí)出錯(cuò)9.2.2填空題1.若已定義:structnum{inta;intb;floatf;}n={1,3,5.0};structnum*pn=&n;則表達(dá)式pn->b/n.a*++pn->b的值是【1】。表達(dá)式(*pn).a+pn->f的值是【2】。2.對(duì)于圖中所示的存儲(chǔ)結(jié)構(gòu),每個(gè)結(jié)點(diǎn)含有三個(gè)域,front是指向前一個(gè)結(jié)點(diǎn)的指針域,data是指向字符串的指針域,next是指向下一個(gè)結(jié)點(diǎn)的指針域,請(qǐng)?zhí)羁胀沓纱私Y(jié)構(gòu)的類型定義和說明。structlink{【1】;char*data;【2】;

溫馨提示

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

評(píng)論

0/150

提交評(píng)論