國家二級C語言(編譯預(yù)處理和指針)機試模擬試卷1(共234題)_第1頁
國家二級C語言(編譯預(yù)處理和指針)機試模擬試卷1(共234題)_第2頁
國家二級C語言(編譯預(yù)處理和指針)機試模擬試卷1(共234題)_第3頁
國家二級C語言(編譯預(yù)處理和指針)機試模擬試卷1(共234題)_第4頁
國家二級C語言(編譯預(yù)處理和指針)機試模擬試卷1(共234題)_第5頁
已閱讀5頁,還剩64頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

國家二級C語言(編譯預(yù)處理和指針)機試模擬試卷1(共9套)(共234題)國家二級C語言(編譯預(yù)處理和指針)機試模擬試卷第1套一、選擇題(本題共26題,每題1.0分,共26分。)1、以下關(guān)于宏的敘述中正確的是A、宏定義必須位于源程序中所有語句之前B、宏名必須用大寫字母表示C、宏調(diào)用比函數(shù)調(diào)用耗費時間D、宏替換沒有數(shù)據(jù)類型限制標(biāo)準(zhǔn)答案:D知識點解析:本題考查宏替換的規(guī)則。宏替換分為簡單的寧符替換和帶參數(shù)的宏替換兩類。使用宏時應(yīng)注意幾點:①宏定義僅僅是符號替換,不是賦值語句,因此不做語法檢查;②為了區(qū)別程序中其他的標(biāo)識符,宏名的定義通常用大寫字母,但不是必須用大寫;③雙引號中出現(xiàn)的宏名不替換;④使用宏定義可以嵌套,即后定義的宏中可以使用先定義的宏。2、有以下程序,程序運行后的輸出結(jié)果是#include<stdio.h>#defineSUB(a)(a)-(a)main(){inta=2,b=3,C=5,d;d=SUB(a+b)*c:printf("%d\n",d);}A、-12B、0C、10D、-20標(biāo)準(zhǔn)答案:D知識點解析:本題主要考查的是宏替換,在程序中執(zhí)行d=sub(a+b)*c這條語句時,首先要進(jìn)行宏替換,依據(jù)宏sUB(a)的定義可知,上面這條語句替換為d=(a+b)-(a+b)*c,因為乘法的優(yōu)先級比減法的優(yōu)先級高,所以先進(jìn)行乘法運算,即d=5-5*5=-20。3、以下敘述中錯誤的是A、預(yù)處理命令行的最后不能以分號表示結(jié)束B、C程序?qū)︻A(yù)處理命令行的處理是在程序執(zhí)行的過程中進(jìn)行的C、#defineMAX是合法的宏定義命令行D、在程序中凡是以“#”開始的語句行都是預(yù)處理命令行標(biāo)準(zhǔn)答案:B知識點解析:預(yù)處理命令行是以“#”開始的語句,預(yù)處理命令行的最后不能以分號表示結(jié)束,預(yù)處理命令行。其中宏定義的字符替換的定義格式為:#define標(biāo)識符字符串,預(yù)處理命令行是在系統(tǒng)對源程序進(jìn)行編譯之前進(jìn)行處理的,不是在程序執(zhí)行的過程中。4、有以下程序,程序運行后的輸出結(jié)果是#include<stdio_h>#defineN2#defineMN+1#defineNUM(M+1)*M/2main(){orintf("%d\n",NUM1);}A、4B、8C、9D、6標(biāo)準(zhǔn)答案:B知識點解析:宏展開以后NUM為(2+1+1)*2+1/2,計算以后值為8。注意在進(jìn)行宏展開的時候,千萬不要試圖計算,展開以后再進(jìn)行計算。5、有以下程序,程序的輸出結(jié)果是#include<stdio.h>#defineSQR(X)X*Xmain(){inta=10,k=2,m=1;a/=SQR(k+m)/SQR(k+m);printf("%d\n",a);}A、0B、1C、9D、10標(biāo)準(zhǔn)答案:B知識點解析:SQR(k+m)宏展開以后為k+m*k+m,值為5,表達(dá)式a/=SQR(k+m)/SQR(k+m)為a=a/(5+5),表達(dá)式值為1。6、有以下程序,程序運行后的輸出結(jié)果是#include<stdio.h>#include<stdlib-h>main(){int*a,*b,*c;a=b=c=(int*)malloc(sizeof(int));*a=1:*b=2,*c=3;a=b;printf("%d,%d,%d\n",*a,*b,*c);}A、2,2,3B、3,3,3C、1,2,3D、1,1,3標(biāo)準(zhǔn)答案:B知識點解析:a=b=c=(int*)malloc(sizeof(int)):含義為申請了一個整型的存儲空間,讓指針a,b,c分別指向它,*a=1;*b=2;*c=3;語句的含義為所申請的整型存儲空間的內(nèi)容,*c=3最后執(zhí)行導(dǎo)致存儲空間的內(nèi)容為3。a=b的含義讓指針a也指向指針b所指向的存儲空間,a,b,c都指向整型的存儲空間,里邊的內(nèi)容為3。7、有以下程序,程序的輸出結(jié)果是voidfun(double*p1,double*p2,double*s){s=(double*)calloc(1,sizeof(double));*s=*P1+*(p2+1);}main(){doublea[2]={1.1,2.2},b[2]={10.0,20.0},*s=a;fun(a,b,s);printf("%5.2f\n",*s);}A、1.10B、11.10C、12.10D、21.10標(biāo)準(zhǔn)答案:A知識點解析:.ANSIC標(biāo)準(zhǔn)規(guī)定calloc函數(shù)返回值的類型為void*。具體使用格式為:calloc(n,size)。該函數(shù)用來給n個同一類型的數(shù)據(jù)項分配連續(xù)的存儲空間,每個數(shù)據(jù)項的長度為size個字節(jié)。若分配成功,函數(shù)返回存儲空間的首地址;否則返回空。通過調(diào)用calloc函數(shù)所分配的存儲單元,系統(tǒng)自動置初值0。主函數(shù)中定義數(shù)組a,b,以及指針s指向數(shù)組a,調(diào)用fun函數(shù),實參a和b,以及s的值傳遞給相對應(yīng)形參p1,p2,以及s,在fun函數(shù)中更改s的指向,以及指向的數(shù)據(jù),但是函數(shù)調(diào)用結(jié)束以后,形參空間撤銷,這項改變對于實參沒有影響。因此實參s指向值不變,仍然為1.1。8、以下敘述中正確的是A、指針變量只能通過求地址運算符(&)來獲得地址值B、語句“p=NULL;”與“p=\0;”是等價的語句C、“int*P1;int**p2;int*p3;”都是合法的定義指針變量的語句D、語句p=NULL;執(zhí)行后,指針P指向地址為0的存儲單元標(biāo)準(zhǔn)答案:C知識點解析:指針變量定義形式為:類型*指針變量名;其中*號的個數(shù)決定了幾級指針,指針變量賦地址值的方式有3種方式:①通過求地址運算符(&)獲得地址值;②通過指針變量獲得地址值;③通過標(biāo)準(zhǔn)函數(shù)獲得地址值。另外NULL是在stdio.h頭文件中定義的預(yù)定義符。NULL的代碼值為0。可以給指針變量賦NULL值。例如p=NULL;賦值語句,稱p為空指針。這條語句等價于p=’\0’;或p=0;這時,指針p并不是指向地址為0的存儲單元,而是具有一個確定的值——“空”。9、設(shè)有定義:intx=0,*p;緊接著的賦值語句正確的是A、*p=NULL;B、p=NULL;C、p=x;D、*p=x;標(biāo)準(zhǔn)答案:B知識點解析:定義指針變量時,必須將指針變量初始化為NULL(為空),否則,如果不賦給它地址,系統(tǒng)會隨機給它分配一個地址。10、有以下程序,程序運行后的輸出結(jié)果是main(){intm=1,n=2,*p=&m,*q=&n,*r;r=p;p=q;q=r;printf("%d,%d,%d,%d\n",m,n,*p,*q);}A、1,2,1,2B、1,2,2,1C、2,1,2,1D、2,1,1,2標(biāo)準(zhǔn)答案:B知識點解析:在主函數(shù)定義了3個整數(shù)指針變量p,q,r,并且使p指向m,q指向n,再執(zhí)行“r=p;p=q;q=r;”這三條語句,使q指向m,p指向n,再輸出變量“m,n,*p,*q”時,它們值分別為1,2,2,1。11、有以下程序,執(zhí)行后的輸出結(jié)果是main(){inta=1,b=3,c=5;int*p1=&a,*p2=&b,**p=&c;*p=*p1*(*p2);printf("%d\n",c);}A、2B、3C、1D、4標(biāo)準(zhǔn)答案:B知識點解析:程序使整型指針p1、p2、p3指向a、b、c值所存放的地址空間。然后再將指針變量*p1、*p2中的值的乘積賦給指針變量*p,即賦給變量c,輸出c的值3。12、有以下程序main(){inta[5]={2,4,6,8,10},*p,**k;p=a:k=&p;printf("%d",*(p++));printf("%d\n",**k);}程序運行后的輸出結(jié)果是A、44B、24C、22D、46標(biāo)準(zhǔn)答案:B知識點解析:主函數(shù)中指針變量p指向數(shù)組a中下標(biāo)為0的元素,k指向p,那么*(p++)的值為2,p指向數(shù)組中下標(biāo)為1的元素,k指向p,所以*k的值為4。13、設(shè)有定義:char*c:以下選項中能夠使c正確指向一個字符串的是A、charstr[]="string";c=str;B、scanf("%s",c);C、c=getchar();D、*c="string";標(biāo)準(zhǔn)答案:A知識點解析:在題目的題干中定義了字符指針變量c,在選項A)中,首先定義字符數(shù)組str,然后再把字符數(shù)組str的酋地址賦給字符指針變量c。所以選項A)是正確的。在選項D)中,如果在定義字符指針c時,同時給c賦初值時,這樣的表達(dá)式是正確的。而本題不是在定義指針c時,同時給c賦初值。14、若有以下定義intx[10],*pt=x;則對x數(shù)組元素的正確引用是A、*(x+3)B、*&x[10]C、*(pt+10)D、pt+3標(biāo)準(zhǔn)答案:A知識點解析:本題考查指針的調(diào)用。x代表x[10]數(shù)組的首地址指針,pt是指向x[10]數(shù)組的首地址的指針,即兩者指向同一內(nèi)存單元。+(x+3)等同于x[3]。15、有以下程序voidfun(intn,int*s){intf;if(n=1)*s=n+1;else{fun(n-1,&f);*s=f;}}main(){intx=0;fun(4,&x);printf("%d\n",x);}程序運行后的輸出結(jié)果是A、1B、3C、4D、2標(biāo)準(zhǔn)答案:D知識點解析:函數(shù)fun為遞歸調(diào)用函數(shù),如果n的值為1,那么后面形參指向的空間存放n+1,否則繼續(xù)計算fun(n-1)的值。調(diào)用分析過程:fun(4,&x)→fun(3,&x)→fun(2,&x)→fun(1,&x)在回歸的過程中,對于x內(nèi)的數(shù)據(jù)并沒有改動。16、有下列程序:voidf(int*q)main(){inti=0;{inta[5]={1,2,3,4,5),i;for(;i<5;i++)(*q)++;)f(a);for(i=0;i<5;i++)printf("%d,",a[i]);}程序運行后的輸出結(jié)果是A、2,2,3,4,5,B、6,2,3,4,5,C、1,2,3,4,5,D、2,3,4,5,6,標(biāo)準(zhǔn)答案:B知識點解析:voidf(int*q)函數(shù)的功能是對(*q)的值連續(xù)5次自加1。在main()函數(shù)中f(a)語句把一維數(shù)組a[5]的首地址作為實參,傳遞給函數(shù)f(int.q)的形參q,然后在函數(shù)f(int*q)內(nèi),a[0]連續(xù)5次自加1后,a[0]的值就變成6,所以輸出為6,2,3,4,5。17、有以下程序:#include<stdio.h>voidmain()voidfun(char*c){chars[81];{while(*c)gets(s);fun(s);puts(s);{if(*c>=’a’&&*c<=’z’)*c=*c-(’a’-’A’);}C++:}}當(dāng)執(zhí)行程序時從鍵盤上輸入HelloBeijing<回車>,則程序的輸出結(jié)果是A、HELLOBEIJINGB、HelloBeijingC、helloBeijingD、hELLOBeijing標(biāo)準(zhǔn)答案:A知識點解析:子函數(shù)fun的功能是把小寫字母轉(zhuǎn)換成大寫字母,所以程序的輸出結(jié)果為選項A)。18、有下列程序:voidf(intb[]){intI:for(i=2;i<6;i++)b[i]=2;}main(){inta[10]={1,2,3,4,5,6,7,8,9,10},i;f(a);for(i=0;i<10,i++)printf("%d,",a[i]);}程序運行后的輸出結(jié)果是A、1,2,3,4,5,6,7,8,9,10,B、1,2,3,4,10,12,14,16,9,10,C、1,2,6,8,10,12,7,8,9,10,D、1,2,6,8,10,12,14,16,9,10,標(biāo)準(zhǔn)答案:C知識點解析:函數(shù)voidf(intb[])的功能是對數(shù)組b[]中第2個到第5個元素的值逐個擴大2倍。所以在main()函數(shù)中,f(a)語句的作用是對數(shù)組a[10]中從a[2]到a[5]的各個數(shù)字乘以2,因而數(shù)組a[10]的元素就變成了{(lán)1,2,6,8,10,12,7,8,9,10}。19、若有以下程序#include<stdio.h>intk=7;voidf(int**s){int*t=&k;*s=t;printf("%d,%d,%d,",k,*t,**s);}main(){inti=3,*p=&i,**r=&p;f(r);printf("%d,%d,%d\n",i,*p,**r);}則程序的輸出結(jié)果是A、3,7,7,7,7,7B、7,7,7,3,3,3C、3,3,3,7,7,7D、7,7,7,3,7,7標(biāo)準(zhǔn)答案:D知識點解析:本題考查了二級指針,二級指針可以保存一級指針的地址。主函數(shù)中p指向i,r指向p。函數(shù)調(diào)用后s指向p,在f函數(shù)中t指向全局變量k=7,s指向t,同時s保存了實參p的地址,此時p也指向t,輸出三個7,流程轉(zhuǎn)到主函數(shù),i的值為3,p以及r的值為7。20、若有以下程序#include<stdio.h>intk=7,m=5;voidf(int**s){int*t=&k;s=&t;*s=&m;printf("%d,%d,%d,",k,*t,**s);}main(){inti=3,*p=&i,**r=&p;f(r);printf("%d,%d,%d\n",i,*p,**r);}則程序的輸出結(jié)果是A、7,5,7,3,3,3,B、7,5,7,3,5,7,C、7,5,5,3,3,3,D、7,7,5,3,3,3,標(biāo)準(zhǔn)答案:C知識點解析:本題考查二級指針作為函數(shù)的參數(shù),可以通過函數(shù)調(diào)用來改變主函數(shù)中一級指針的指向。主函數(shù)中指針變量p指向i,r指向p,調(diào)用f函數(shù),形參指針s指向p,流程轉(zhuǎn)到f函數(shù)執(zhí)行,指針變量t指向k,s指向t,此時更改了s的指向,s指向了t,更改了s指向的地址空間內(nèi)容為m的地址,同時t也指向變量m,因此**s的值為m的值,*t為m的值,k為7。流程返回到主函數(shù),沒有對主函數(shù)空間的數(shù)據(jù)和指向作出更改,因此全部為3。21、有以下程序voidfun(intx,inty,int*c,int*d){*c=x+y;*d=x-y;}main(){inta=4,b=3,c=0,d=0;fun(a,b,&c,&d);printf("%d%d\n",c,d);}程序的輸出結(jié)果是A、43B、34C、71D、00標(biāo)準(zhǔn)答案:C知識點解析:函數(shù)fun有四個形參,功能是利用參數(shù)的地址傳遞來計算前兩個參數(shù)的和與差。主函數(shù)中調(diào)用fun函數(shù)c計算針3,d計算4-3值為1。22、有以下程序voidswap(char*x,char*y)main(){chart;{char*s1="abc",*S2="123";t=*x;*x=*y;*y=t;swap(s1,s2);pfintf("%s,%s\n",s1,s2);}}程序執(zhí)行后的輸出結(jié)果是A、abc,123B、123,abcC、321,cbaD、1bc,a23標(biāo)準(zhǔn)答案:D知識點解析:函數(shù)voidswap(char*x,char*y)的功能是交換兩個字符*x和*y中的內(nèi)容。在主函數(shù)中字符指針s1指向字符串’abc’,s2指向字符串’123’。所以函數(shù)swap(s1,s2)的執(zhí)行結(jié)果就是字符’a’和’1’相互交換。23、有以下程序(說明:字*A的ASCII碼值是65)voidfun(char*s){while(*s){if(*s%2)printf("%c",*s);s++;}}main(){chara[]="BYTE";fun(a);printf("\n");}程序運行后的輸出結(jié)果是A、BTB、YEC、YTD、BY標(biāo)準(zhǔn)答案:B知識點解析:程序只輸出字母ASCII值為奇數(shù)的字母,根據(jù)字母B,Y,T,E的ASCII值的奇偶性相應(yīng)輸出。24、有以下程序#include<stdio.h>main()voidfun(char*a,char*b){char*s="****a*b****",t[80];{while(*a==’*’)a++;fun(s,t);puts(t);while(*b=*a){b++;a++;}}}程序的運行結(jié)果是A、a*bB、*****a*bC、a*b****D、ab標(biāo)準(zhǔn)答案:C知識點解析:主函數(shù)mare()定義了指向字符串的指針和一個字符數(shù)組,接著調(diào)用fun(s,t)函數(shù),進(jìn)行實參向形參傳遞。函數(shù)fun()第一個while語句判斷*a中的值為“+”時繼續(xù)掃描,當(dāng)遇到不是“*”時結(jié)束,接著第二個while循環(huán)語句,將*a中從“a”開始的后續(xù)所有字符都賦予*b,也就是t[80]中的內(nèi)容為“a*b****”。25、有以下程序#include<stdio.h>main()voidfun(char*t,char*s){charss[10]="acc",aa[10]="bbxxyy";{while(*t!=0)t++;fun(ss,aa);printf("%s,%s\n",ss,aa);while((*t++=*s++)!=0);}}程序的運行結(jié)果是A、acc,bbxxyyB、accxxyy,bbxxyyC、accbbxxyy,bbxxyyD、accxyy,bbxxyy標(biāo)準(zhǔn)答案:C知識點解析:fun函數(shù)中,第1個while循環(huán)語句使指針t指向字符串的末尾,第2個while循環(huán)語句實現(xiàn)了字符串t和s的連接。主函數(shù)中語句fun(ss,aa)的功能是將字符串a(chǎn)a連接到字符串ss的末尾。26、有以下程序#include<stdio.h>#include<string.h>voidfun(int*p1,int*p2,int*s){s=(int*)calloc(1,sizeof(int));*s=*p1+*p2;flee(s);}main(){inta[2]={1,2},b[2]={40.50},*q=a;fun(a,b,q);printf("%d\n",*q);}程序運行后的輸出結(jié)果是A、41B、42C、0D、1標(biāo)準(zhǔn)答案:A知識點解析:主函數(shù)定義數(shù)組a,b,q指向數(shù)組a,調(diào)用fun函數(shù)以后形參接收實參的數(shù)據(jù),p1和p2指向數(shù)組a和b,同時s指向數(shù)組a,在fun函數(shù)中改變了s的指向和賦值,但是在程序調(diào)用結(jié)束之間形參空間全部釋放,因此對于s的指向改動不會對主函數(shù)參數(shù)構(gòu)成影響。因此主函數(shù)中數(shù)去*q的值仍然為1。國家二級C語言(編譯預(yù)處理和指針)機試模擬試卷第2套一、選擇題(本題共26題,每題1.0分,共26分。)1、有以下程序,程序運行后的輸出結(jié)果是#definePT3.5;#defineS(x)PT*x*x;main(){inta=1,b=2;printf("%4.1f\n",S(a+b));}A、31.5B、7.5C、程序有錯無輸出結(jié)果D、14.0標(biāo)準(zhǔn)答案:C知識點解析:本題考查宏定義。預(yù)處理語句后面不能加分號,因此程序有錯。如果沒加分號的話S(a+b)=PT*a+b*a+b=3.5*1+2*1+2=7.5。2、設(shè)有宏定義:#defineIsDIV(k,n)((k%n==1)?1:0)且變量m已正確定義并賦值,則宏調(diào)用:IsDIV(m,5)&&lsDIV(m,7)為真時所要表達(dá)的是A、判斷m是否能被5和7整除B、判斷m被5或者7整除是否余1C、判斷m被5和7整除是否都余1D、判斷m是否能被5或者7整除標(biāo)準(zhǔn)答案:C知識點解析:本題考查宏定義和三目運算符。三目運算符的格式為:test?語句1:語句2其中,test可以是任何Boolean表達(dá)式。語句1,當(dāng)test是true時執(zhí)行該語句,可以是復(fù)合語句;語句2,當(dāng)test是false時執(zhí)行該語句,可以是復(fù)合語句。isDIV(k,n)要表達(dá)的是當(dāng)k除n的余數(shù)是1時表達(dá)式的值為1,否則為0,所以題中要表達(dá)的是m被5和7整除是否都余1。3、有下列程序,程序的運行結(jié)果是#include<stdio.h>#defineN5#defineMN+1#definef(x)(x*M)main(){inti1,i2;i1=f(2);i2=f(1+1);printf("%d%d\n",i1,i2);}A、127B、1212C、1111D、117標(biāo)準(zhǔn)答案:D知識點解析:在本題中,定義了3個宏定義語句,分別是:#defineN5、#defineMN+5和#definef(x)(x*M),所以根據(jù)C語言的宏替換規(guī)則,我們可知,f(2)=2*N+1=2*5+1=11,f(1+1)=1+1*N+1=1+1*5+1=7。4、若有以下程序,則程序的輸出結(jié)果是#defineS(x)x*x#defineT(x)S(x)*S(x)main(){intk=5,j=2;printf("%d,%d\n",S(k+j),T(k+j));}A、17,37B、49,2401C、17,289D、49,289標(biāo)準(zhǔn)答案:A知識點解析:本題考查了宏替換,宏替換就是簡單的字符替換,不會進(jìn)行語法錯誤檢查也不會進(jìn)行運算?!皊(k+j)”宏展開以后為“k+i*k+j”,值為17,“T(k+j)”宏展開以后為“k+i*k+j*k+i*k+i”,值為37。5、下面選項中關(guān)于編譯預(yù)處理的敘述正確的是A、凡是以#號開頭的行,都被稱為編譯預(yù)處理命令行B、預(yù)處理命令行必須使用分號結(jié)尾C、預(yù)處理命令行不能出現(xiàn)在程序的最后一行D、預(yù)處理命令行的作用域是到最近的函數(shù)結(jié)束處標(biāo)準(zhǔn)答案:A知識點解析:在C語言中,凡是以“#”號開頭的行,都稱為編譯預(yù)處理命令行。這些預(yù)處理命令組成的預(yù)處理命令行必須在一行的開頭以“#”號開始,每行的末尾不能用“;”號結(jié)束。以區(qū)別于C語句、定義和說明語句。根據(jù)需要,命令行可以出現(xiàn)在程序的任何一行的開始部位,其作用一直持續(xù)到源文件的末尾。6、有以下程序,程序的運行結(jié)果是#include<stdio.h>#include<stdlib.h>intfun(intn)main(){int*p;{inta;p=(int*)malloc(sizeof(int));a=fun(10);*p=n;return*p;printf("%d\n",a+fun(10));}}A、10B、20C、0D、出錯標(biāo)準(zhǔn)答案:B知識點解析:函數(shù)fun(intn)的功能是在內(nèi)存中每次動態(tài)的申請一個整型變量的存儲空間,把整型變量n的值存入這個存儲空間中。所以當(dāng)在主函數(shù)中執(zhí)行輸出語句時,a+fun(10)的值等于20。7、有以下程序段int*p;p=_______malloc(sizeof(int));若要求使P指向一個int型的動態(tài)存儲單元,在橫線處應(yīng)填入的是A、(int*)B、intC、int*D、(*int)標(biāo)準(zhǔn)答案:A知識點解析:ANSIC標(biāo)準(zhǔn)規(guī)定malloc函數(shù)返回值的類型為void*。使用形式為:malloc(size),其中size的類型為unsignedint。malloc函數(shù)用來分配size個字節(jié)的存儲區(qū),返回一個指向存儲區(qū)首地址的基類型為void的地址。若沒有足夠的內(nèi)存單元供分配,函數(shù)返回空(NULL)??梢酝ㄟ^強制類型轉(zhuǎn)換將返回值轉(zhuǎn)換為需要類型的地址。8、設(shè)有定義語句int(*f)(int);則以下敘述正確的是A、f是基類型為int的指針變量B、f是指向int類型一維數(shù)組的指針變量C、f是指向函數(shù)的指針變量,該函數(shù)具有一個int類型的形參D、f是函數(shù)名,該函數(shù)的返回值是基類型為int類型的地址標(biāo)準(zhǔn)答案:C知識點解析:定義語句int(*f)(int)中f是指向函數(shù)的指針變量,該函數(shù)中也只有一個int型的形參。9、設(shè)有某函數(shù)的說明為int*func(inta[10],intn);則下列敘述中,正確的是A、說明中的a[10]寫成a[]或*a效果完全一樣B、形參a對應(yīng)的實參只能是數(shù)組名C、func的函數(shù)體中不能對a進(jìn)行移動指針(如a++)的操作D、只有指向10個整數(shù)內(nèi)存單元的指針,才能作為實參傳給a標(biāo)準(zhǔn)答案:A知識點解析:函數(shù):func為返回值為指針的函數(shù),有兩個形參,形參數(shù)組a為指針變量,保存實參數(shù)組的首地址,其元素個數(shù)由實參數(shù)組決定,因此說明中的a[10]寫成a[]或*a效果完全一樣。10、設(shè)已有定義:floatx;則以下對指針變量p進(jìn)行定義且賦初值的語句中正確的是A、int*p=(float)x;B、float*p=&x;C、floatp=&x;D、float*p=1024;標(biāo)準(zhǔn)答案:B知識點解析:定義指針變量的一般形式為:類型名*指針變量名1,*指針變量名2,……;對一個指針變量賦值要通過求地址運算符(&)獲得變量的地址值,然后把此地址值賦給指針變量。因而在選項A)的表達(dá)式中。賦值號的左邊表示定義了指針變量口,而右邊表示求變量x的地址值。11、設(shè)有定義doublea[10],*s=a;以下能夠代表數(shù)組元素a[3]的是A、(*s)[3]B、*s[3]C、*s+3D、*(s+3)標(biāo)準(zhǔn)答案:D知識點解析:語句*s=a,使用指針變量s指向一維數(shù)組a的首地址,所以*(s+3)表示的是引用數(shù)組a[3]。12、若有定義語句:intyear=2009,*p=&year;以下不能使變量year中的值增至2010的語句是A、(*p)++;B、++(*p);C、*p++;D、*p+=1;標(biāo)準(zhǔn)答案:C知識點解析:由于自加運算符++的運算級高于間接運算*的運算級,所以選項A)的表達(dá)式*p++不能使變量year中的值增至2010。13、有以下程序(注:字符a的ASCII碼值為97)main(){char*s={"abc"};do{printf("%d",*s%10);++s;}while(*s);}程序運行后的輸出結(jié)果是A、abcB、7890C、979899D、789標(biāo)準(zhǔn)答案:D知識點解析:因為小寫字符a,b,c的ASCII的值分別為97,98,99,而在dowhile循環(huán)語句中,每次對字符的ASCII的值取余數(shù)并輸出,第一次循環(huán)輸出7,第二次循環(huán)輸出8,第三次循環(huán)輸出9。14、若有定義語句:doublea,*p=&a;以下敘述中錯誤的是A、定義語句中的*號是一個說明符B、定義語句中的p只能存放double類型變量的地址C、定義語句中,*p=&a把變量a的地址作為初值賦給指針變量pD、定義語句中的*號是一個間址運算符標(biāo)準(zhǔn)答案:D知識點解析:在指針定義語句“doublea,*p=&a”中,指針變量p前面的*號,只是一個說明符,說明變量p是指針類型的變量。15、有以下程序voidfun(char*s){chara[10];main(){char*p="PROGRAM";strcpy(a,"STRING");fun(p);sa;}printf("%s\n",p);}程序運行后的輸出結(jié)果是(此處□代表空格)A、STRING□□□□B、PROGRAMC、STRING□□□D、STRING標(biāo)準(zhǔn)答案:B知識點解析:函數(shù)fun的主要功能是把字符串"STRING",存放到字符數(shù)組a中,s指向該字符串,函數(shù)調(diào)用結(jié)束以后,釋放s和a指向的空間。主函數(shù)調(diào)用fun(p),并不能更改p的值。因此p的指向沒有改變。16、有以下程序#include<stdio.h>main()#defineN4{intx[][N]={{1,2,3},{4},{5,6,7,8},{9,10}},voidfun(inta[][N],intb[])y[N],i;{inti;fun(x,y);for(i=0;i<N;i++)b[i]=a[i][i];for(i=0;i<N;i++)printf("%d,",y[i]);)printf("kn");}程序的運行結(jié)果是A、1,2,3,4,B、1,4,5,9,C、1,0,7,0,D、3,4,8,10,標(biāo)準(zhǔn)答案:C知識點解析:函數(shù)矗m(inta[][N],intb[])的功能是把矩陣a[N][N]主對角線上的元素賦給一維數(shù)組b[]。在主函數(shù)中由x[][N]的初始化可知,其主對角線上的元素是1,0,7,0。所以當(dāng)執(zhí)行完函數(shù)fun(x,y)后,一維數(shù)組元素y[]中的元素值為1,0,7,0。17、以F函數(shù)按每行8個輸出數(shù)組中的數(shù)據(jù):voidfun(int*w,intn){inti;for(i=0:i<n;i++){______________printf("%d",w[i]);}printf("\n");}下劃線處應(yīng)填入的語句是A、if(i%8==0)printf("\n");B、if(i/8==0)continue;C、if(i/8==0)printf("\n");D、if(i%8==0)continue;標(biāo)準(zhǔn)答案:A知識點解析:本題考查判斷語句與循環(huán)語句。欲使每行輸出8個數(shù)據(jù),則必然使用取余運算,當(dāng)i%8==0時先輸出一個換行符再輸出字符。選項D)中,comtinue語句的作用是停止執(zhí)行本次循環(huán)位于continue后面的語句,而進(jìn)入下一次循環(huán)。18、有以下程序#include<stdio.h>main()voidfun(int*a,int*b){intx=3,y5,*p=&x,*q=&y;{int*c;fun(p,q);printf("%d,%d,",*p,*q);c=a;a=b;b=c;}fun(&x,&y);printf("%d,%d\n",*p,*q);}程序運行后的輸出結(jié)果是A、3,5,5,3B、3,5,3,5C、5,3,3,5D、5,3,5,3標(biāo)準(zhǔn)答案:B知識點解析:本題考查函數(shù)的調(diào)用與指針。D和q分別為指向x和y的指針,函數(shù)fun()的兩個形參均為指針型,主要功能為交換兩個指針的指向,當(dāng)調(diào)用結(jié)束以后,該操作不能返回主函數(shù)。而主函數(shù)中,fun(p,q)、fun(&x,&y)的實參均為x與y的地址,因此,兩者結(jié)果相同,并且兩者指針指向的值不能變化。19、若有以下程序#include<stdio.h>voidsp(int*a){intb=2;main(){intk=3,*p=&k;a=&b;sp(p);*a=*a*2;printf("%d,%d\n",k,*p);printf("%d",*a);}}則程序的輸出結(jié)果是A、4,3,4B、4,3,3C、6,3,6D、6,6,6標(biāo)準(zhǔn)答案:B知識點解析:主函數(shù)中定義指針變量p指向k,調(diào)用函數(shù)sp(p),將k的地址傳遞給形參指針a,函數(shù)轉(zhuǎn)到sp運行,a指向b的地址,表達(dá)式*a=*a+2,相當(dāng)于b=b*2,得到*a的數(shù)據(jù)4輸出。函數(shù)調(diào)用結(jié)束,此時a和b的空間撤銷,而對實參k和p的值并沒有改變,仍舊是3。20、若有以下程序#3include<stdio_h>main(){intk=3;voidsp(int*a){intb=2;sp(&k);*a=*a*2;printf("%d\n",k);printf("%d,",*a);}a=&b;*a=*a*2;printf("%d,",*a);}則程序的輸出結(jié)果是A、6,4,6B、6,4,3C、6,12,12D、9,4,9標(biāo)準(zhǔn)答案:A知識點解析:本題考查了指針作為函數(shù)的參數(shù),可以接收實參變量的地址,改變實參的值。主函數(shù)調(diào)用sp(&k),執(zhí)行sp函數(shù)a指向向k,執(zhí)行語句*a=*a*2后a指向空間的值k的值為6,改變a的指向以后,此時a指向b,則執(zhí)行*a=*a*2以后,a指向空間b的值為4。調(diào)用結(jié)束返回主函數(shù).輸出k的值為6。21、有以下程序#include<stdio.h>intfuna(inta,intb){retuma+b;}intfunb(inta,intb){returna-b;}intsss(int(*t)(),intx,inty){retum((*t)(x,y));}main(){intx;X=SSS(funa,9,3);x+=sss(funb,8,3);printf("%d\n",x);}程序運行后的輸出結(jié)果是A、17B、23C、24D、22標(biāo)準(zhǔn)答案:A知識點解析:函數(shù)funa的功能計算兩個數(shù)據(jù)的和,funb的功能計算兩個數(shù)據(jù)的差,函數(shù)sss中利用指向函數(shù)的指針作為函數(shù)的參數(shù),可以在調(diào)用的時候,根據(jù)接收的函數(shù)地址來決定調(diào)用那一個函數(shù)。主函數(shù)中調(diào)用x=sss(funa,9,3),將funa函數(shù)的地址傳遞給t,因此sss函數(shù)成為求兩個數(shù)據(jù)的和12,繼續(xù)將funb函數(shù)地址傳給t,求兩個數(shù)據(jù)差為5,和s累加后結(jié)果為17。22、有以下程序charfun(char*c){if(*c<=’Z’&&*c>=’A’)*c-=’A’-’a’;return*c;}main(){chars[81],*p=s;gets(s);while(*p){*p=fun(P);putchar(*p);p++;)printf("\n");}若運行時從鍵盤上輸入OPENTHEDOOR,程序的輸出結(jié)果是A、OPENtHEdOORB、openthedoorC、OPENTHEDOORD、OpenTheDoor標(biāo)準(zhǔn)答案:B知識點解析:函數(shù)fun的主要功能是判斷字符是否為大寫字符,如果是則轉(zhuǎn)換為小寫字符,主函數(shù)讀入大寫字符串,轉(zhuǎn)換成小寫。23、有以下函數(shù)intfun(char*s){char*t=s;while(*t++);return(t-s);}該函數(shù)的功能是A、比較兩個字符串的大小B、計算s所指字符串的長度C、計算s所指字符串占用內(nèi)存字節(jié)的個數(shù)D、將s所指字符串復(fù)制到字符串t中標(biāo)準(zhǔn)答案:C知識點解析:在函數(shù)fun(char*s)中,首先用字符指針變量t指向s,而循環(huán)語句while(*t++);的功能是使指針變量t指向字符串變量s的末尾,這時退出循環(huán),因而語句return(t-s);返回的就是字符串s所指字符串的長度。24、有以下程序voidfun1(char*p)main(){char*q;{chara[]={"Program"},*p;q=p;p=&a[3];fun1(p);printf("%s\n",a);while(*q!=’\0’)}{(*q)++;q++;}}程序執(zhí)行后的輸出結(jié)果是A、PrphsbnB、ProhsbnC、ProgsbnD、Program標(biāo)準(zhǔn)答案:B知識點解析:在函數(shù)voidfunl(char*p)中,語句(*q)++的功能是q所指的字符加1,變成其后面的字符:q++就是指針q指向下一個字符的位置。所以在主函數(shù)中。語句p=&a[3]的作用是使指針p指向字符數(shù)組a[]中的第四個字符的位置,即D指向字符’g’:然后調(diào)用函數(shù)fun1(p)后,字符’g’變成’h’,字符’r’變成’s’,字符’a’變成’b’,字符’m’變成’n’,因而字符數(shù)組a[]中的內(nèi)容就成“Prohshn”。25、有以下程序#include<stdio.h>#include<string.h>voidfun(chars[][10],intn){chart;inti,j;for(i=0;i<n-1;i++)for(j=i+1;j<n;j++)if(s[i][0]>s[j][0]){t=s[i][0];s[i][0]=s[j][0];s[j][0]=t;}}main(){charss[5][10]={"bcc","bbcc","xy","aaaacc","aabcc"};fun(ss,5A、aaaacc,xyB、bcc,aabccC、xy,aaaaccD、aabcc,bcc標(biāo)準(zhǔn)答案:C知識點解析:函數(shù)fun([chars[][10],intn)通過兩重for循環(huán)語句,比較二維字符數(shù)組s[][10]的每個字符串的首字符大小,如果前一個字符串首字符大于后一個字符串的首字符,則交換這兩個字符串的首字符。在主函數(shù)中,語句fun(ss,5)的作用是對二維字符數(shù)組ss[5][10]的5個字符串的首字符進(jìn)行從小到大的排序,不影響各個字符串另外的字符。所以排序結(jié)束后,5個字符串的第一個字符依次變?yōu)閍、a、b、b和x;最后輸出第1個和第4個字符串。26、有以下程序:#include<stdio.h>intb=2;intfun(int*k){b=*k+b;return(b);}main(){inta[10]={1,2,3,4,5,6,7,8},i;for(i=2;i<4;i++){b=fun(&a[i])+b;printf("%d",b);}printf("\n");}程序運行后的輸出結(jié)果是A、810B、1028C、1012D、1016標(biāo)準(zhǔn)答案:B知識點解析:i=2時,fua(&a[2])返回值是b=b+a[1]=2+3=5,b=b+b=5+5=10:i=3時,fun(&a[3])返回值是b=b+a[3]=10+4=14,b=b+b=14+14=28。國家二級C語言(編譯預(yù)處理和指針)機試模擬試卷第3套一、選擇題(本題共26題,每題1.0分,共26分。)1、有以下程序#includevoidfun(int*a,int*b){int*c;c=a;a=b;b=c;}main(){intx=3,y=5,*p=&x,*q=&y;fun(p,q);printf("%d,%d,",*p,*q);fun(&x,&y);printf("%d,%d\n",*p,*q);}程序運行后的輸出結(jié)果是A、3,5,5,3B、3,5,3,5C、5,3,3,5D、5,3,5,3標(biāo)準(zhǔn)答案:B知識點解析:本題考查函數(shù)的調(diào)用與指針。p和q分別為指向x和y的指針,函數(shù)fun()的兩個形參均為指針型,主要功能為交換兩個指針的指向,當(dāng)調(diào)用結(jié)束以后,該操作不能返回主函數(shù)。而主函數(shù)中,fun(p,q)、fun(&x,&y)的實參均為x與y的地址,因此,兩者結(jié)果相同,并且兩者指針指向的值不能變化。2、有下列程序:voidf(intb[]){intI;for(i=2;i<6;i++)b[i]*=2;}main(){inta[i0]={1,2,3,4,5,6,7,8,9,10),j;f(a);for(i=0;i<10,i++)printf("%d,",a[i]);}程序運行后的輸出結(jié)果是A、1,2,3,4,5,6,7,8,9,10,B、1,2,3,4,10,12,14,16,9,10,C、1,2,6,8,10,12,7,8,9,10,D、1,2,6,8,10,12,14,16,9,10,標(biāo)準(zhǔn)答案:C知識點解析:函數(shù)voidf(intb[])的功能是對數(shù)組b[]中第2個到第5個元素的值逐個擴大2倍。所以在main()函數(shù)中,f(a)語句的作用是對數(shù)組a[10]中從a[2]到a[5]的各個數(shù)字乘以2,因而數(shù)組a[10]的元素就變成了{(lán)1,2,6,8,10,12,7,8,9,10}。3、有以下程序#includeintfun(chars[]){intn=0;while(*s<=’9’&&*s>=’0’){n=10*n+*s-’0’;s++;}return(n);}main(){chars[10]={’6’,’1’,’*’,’4’,’*’,’9’,’*’,’0’,’*’);printf("%d\n",fun(s));}程序的運行結(jié)果是A、61490B、61C、9D、5標(biāo)準(zhǔn)答案:B知識點解析:在fun函數(shù)中,while循環(huán)的功能是逐個取字符數(shù)組s的字符判斷其是否是數(shù)字。若是則將這些數(shù)字組成一個數(shù)保存到變量n中,并返回變量n的值。所以在主函數(shù)中調(diào)用fun(s)時,將把字符數(shù)組s中的數(shù)字組成一個數(shù)輸出。因為當(dāng)指針s指向數(shù)組的第3位時,即字符’*’,循環(huán)條件不成立,循環(huán)結(jié)束,返回n的值。所以輸出n的值為61。4、若有以下程序#includevoidsp(int*a){intb=2;a=&b;*a=*a*2;printf("%d,",*a);)main(){intk=3,*p=&k;sp(p);printf("%d,%d\n",k,*p);)則程序的輸出結(jié)果是A、4,3,4B、4,3,3C、6,3,6D、6,6,6標(biāo)準(zhǔn)答案:B知識點解析:主函數(shù)中定義指針變量p指向k,調(diào)用函數(shù)sp(p),將k的地址傳遞給形參指針a,函數(shù)轉(zhuǎn)到sp運行,a指向b的地址,表達(dá)式*a=*a*2,相當(dāng)于b=b*2,得到*a的數(shù)據(jù)4輸出。函數(shù)調(diào)用結(jié)束,此時a和b的空間撤銷,而對實參k和p的值并沒有改變,仍舊是3。5、若有以下程序#include2ntk=7;voidf(int*s){int*t=&k;*s=t;printf("%d,%d,%d,",k,*t,**s);}main(){infi=3,*p=&i,**r=&p;f(r);printf("%d,%d,%d\n",i,*p,**r);}則程序的輸出結(jié)果是A、3,7,7,7,7,7B、7,7,7,3,3,3C、3,3,3,7,7,7D、7,7,7,3,7,7標(biāo)準(zhǔn)答案:D知識點解析:本題考查了二級指針,二級指針可以保存一級指針的地址。主函數(shù)中p指向i,r指向p,函數(shù)調(diào)用后s指向p,在f函數(shù)中t指向全局變量k=7,s指向t,同時s保存了實參p的地址,此時p也指向t,輸出三個7,流程轉(zhuǎn)到主函數(shù),i的值為3,p以及r的值為7。6、若有以下程序#includeint*f(int*s,int*t){int*k;if(*s<*t){k=s;s=t;t=k;}returns;}Inain(){inti=3,j=5,*p=&i,*q=&j,*r;r=f(p,q);printf("%d,%d,%d,%d,%d\n",i,j,*p,*q,*r);}則程序的輸出結(jié)果是A、3,5,5,3,5B、5,3,5,3,5C、5,3,3,5,5D、3,5,3,5,5標(biāo)準(zhǔn)答案:D知識點解析:本題考查了返回值為指針的函數(shù),函數(shù)f的主要功能為第一個參數(shù)小于第二個參數(shù),那么交換指針的指向,這對于實參指向的數(shù)據(jù)時沒有影響的。最后返回比較大的元素的地址。主函數(shù)中p指向i,q指向j,調(diào)用r=f(p,q),返回q的地址,因此*p=3,*q=5,*r=5。7、若有以下程序#includevoidsp(int*a){intb=2;*a=*a*2;printf("%d,",*a);a=&b;*a=*a*2;printf("%d,",*a);}main(){intk=3;sp(&k);printf("%d\n",k);)則程序的輸出結(jié)果是A、6,4,6B、6,4,3C、6,12,12D、9,4,9標(biāo)準(zhǔn)答案:A知識點解析:本題考查了指針作為函數(shù)的參數(shù),可以接收實參變量的地址,改變實參的值。主函數(shù)調(diào)用sp(&k),執(zhí)行sp函數(shù)a指向向k,執(zhí)行語句*a=*a*2后a指向空間的值k的值為6,改變a的指向以后,此時a指向b,則執(zhí)行*a=*a*2以后,a指向空間b的值為4。調(diào)用結(jié)束返回主函數(shù),輸出k的值為6。8、若有以下程序#includeintk=7,m=5;voidf(int**s){int*t=&k;S=&t;*s=&m;printf("%d,%d,%d,",k,*t,**s);}main(){inti=3,*p=&i,**r=&p;f(r);printf("%d,%d,%d\n",i,*p,**r)}則程序的輸出結(jié)果是A、7,5,7,3,3,3,B、7,5,7,3,5,7,C、7,5,5,3,3,3,D、7,7,5,3,3,3,標(biāo)準(zhǔn)答案:C知識點解析:本題考查二級指針作為函數(shù)的參數(shù),可以通過函數(shù)調(diào)用來改變主函數(shù)中一級指針的指向。主函數(shù)中指針變量p指向i,r指向p,調(diào)用f函數(shù),彤參指針s指向p,流程轉(zhuǎn)到f函數(shù)執(zhí)行,指針變量t指向k,s指向t,此時更改了s的指向,s指向了t,更改了s指向的地址空間內(nèi)容為m的地址,同時t也指向變量m,因此**s的值為m的值,*t為m的值,k為7。流程返回到豐函數(shù),沒有對主函數(shù)空間的數(shù)據(jù)和指向作出更改,因此全部為3。9、若有以下程序#includeint*f(int*s,int*t){intk;if(*s<*t){k=*s;*s=*t;*t=k;}returns;)main(){int1=3,j=5,*p=&i,*q=&j,*r;r=f(p,q);printf("%d,%d,%d,%d,%d\n",i,j,*p,*q,*r);}則程序的輸出結(jié)果是A、3,5,5,3,5B、3,5,3,5,5C、5,3,5,3,5D、5,3,3,5,5標(biāo)準(zhǔn)答案:C知識點解析:函數(shù)f為返回值為指針的函數(shù),主要功能是返回s和t指向空間值大的數(shù)據(jù)的地址,同時如何s指向空間數(shù)據(jù)大于t指向空間的數(shù)據(jù),那么交換。t函數(shù)p和q指向i和j,值為3和5,j的值大于i的值,因此調(diào)用函數(shù)f以后,返回j的地址,r指向j,同時i和j的值交換,i=5,j=3,p和q的指向不變,p指向i,q指向j。10、有以下程序#includeintfuna(inta,intb){returna+b;}intfunb(inta,intb){returna-b;}intsss(int:(*t)(),intx,inty){return((*t)(x,y));)main(){intx;x=sss(funa,9,3);x+=sss(funb,8,3);printf("%d\n",x);}程序運行后的輸出結(jié)果是A、17B、23C、24D、22標(biāo)準(zhǔn)答案:A知識點解析:函數(shù)funa的功能計算兩個數(shù)據(jù)的和,funb的功能計算兩個數(shù)據(jù)的差,函數(shù)sss中利用指向函數(shù)的指針作為函數(shù)的參數(shù),可以在調(diào)用的時候,根據(jù)接收的函數(shù)地址來決定調(diào)用那一個函數(shù)。主函數(shù)中調(diào)用x=sss(funa,9,3),將funa函數(shù)的地址傳遞給t,因此SSS涿l數(shù)成為求兩個數(shù)據(jù)的和12,繼續(xù)將:funb函數(shù)地址傳給t,求兩個數(shù)據(jù)差為5,和s累加后結(jié)果為17。11、有以下程序voidfun(intx,inty,int*c,int*d){*c=x+y;*d=x-y;}main(){inta=4,b=3,c=0,d=0;fun(a,b,&c,&d);printf("%d%d\n",c,d);}程序的輸出結(jié)果是A、43B、34C、71D、00標(biāo)準(zhǔn)答案:C知識點解析:函數(shù)fun有四個形參,功能是利用參數(shù)的地址傳遞來計算前兩個參數(shù)的和與差。豐函數(shù)中調(diào)用fun函數(shù)c計算4+3。d計算4.3值為1。12、有以下程序voidfun(int*p,int*q){intt;t=*p;*p=*q;*q=t;*q==*p;}main(){inta=0,b=9;fun(&a,&b);Ptintf(”%d%d\n",a,b);}程序的輸出結(jié)果是A、00B、99C、90D、09標(biāo)準(zhǔn)答案:B知識點解析:函數(shù):fun的主要功能是交換p和q指向的地址空間的數(shù)據(jù),然后更改p的指向的地址空間數(shù)據(jù),使之和q指向的數(shù)據(jù)相同。主函數(shù)調(diào)用fun后,p指向a,q指向b,囚此a和b的數(shù)據(jù)全部為9。13、有以下程序charfun(ehar*c){if(*c<=’Z’&&*c>=’A’)*c-=’A’一’a’;return*c;}main(){chars[81],*p=s;gets(s);while(*p){*p=fun(p);putchar(*p);p++;}printf("\n");}若運行時從鍵盤上輸入OPENTHEDOOR,程序的輸出結(jié)果是A、oPENtHEdOORB、openthedoorC、OPENTHEDOORD、OpenTheDoor標(biāo)準(zhǔn)答案:B知識點解析:函數(shù)fun的主要功能是判斷字符是否為大寫字符,如果是則轉(zhuǎn)換為小寫字符,主函數(shù)讀入大寫字符串,轉(zhuǎn)換成小寫。14、有以下程序voidswap(char*x,char*y){chart;t=*x;*x=*y;*y=t;}main(){char,*s1="abc",*s2="123";swap(s1,s2);printf("%s,%s\n",s1,s2);}程序執(zhí)行后的輸出結(jié)果是A、abc,123B、123,abcC、321,cbaD、lbc,a23標(biāo)準(zhǔn)答案:D知識點解析:函數(shù)voidswap(chat*x,chat*y)的功能是交換兩個字符*x和*y中的內(nèi)容。在主函數(shù)中字符指針s1指向字符串’abc’,s2指向字符串’123’。所以函數(shù)swap(s1,s2)的執(zhí)行結(jié)果就是字符’a’和’1’相互交換。15、有以下函數(shù)intfun(char*x,char*y){intn=0;while((*x:=*y)&&*x!=’\0’){x++;y++;n++;}returnn;}函數(shù)的功能是A、查找x和y所指字符串中是否有’\0’B、統(tǒng)計x和y所指字符串中最前面連續(xù)相同的字符個數(shù)C、將y所指字符串賦給x所指存儲空間D、統(tǒng)計x和y所指字符串中相同的字符個數(shù)標(biāo)準(zhǔn)答案:B知識點解析:在while循環(huán)中的判斷表達(dá)式為(*x==*y)&&*x!=’\0’,所以只要字符串x與y的當(dāng)前字符不相等時,循環(huán)就結(jié)束。16、有以下函數(shù)intfun(char*s){char*t=s;while(*t++);return(t-s);}該函數(shù)的功能是A、比較兩個字符串的大小B、計算s所指字符串的長度C、計算s所指字符串占用內(nèi)存字節(jié)的個數(shù)D、將s所指字符串復(fù)制到字符串t中標(biāo)準(zhǔn)答案:C知識點解析:在函數(shù)fun(chat*s)中,首先用字符指針變量t指向s,而循環(huán)語句while(*t++);的功能是使指針變量t指向字符串變量s的末尾,這時退出循環(huán),因而語句return(t-s);返回的就是字符串s所指字符串的長度。17、有以下程序(說明:字母A的ASCII碼值是65)voidfun(char*s){while(*s){if(*s%2)printf("%c",*s);s++;}}main(){chara[]="BYTE";fun(a);print=f("\n");)程序運行后的輸出結(jié)果是A、BTB、YEC、YTD、BY標(biāo)準(zhǔn)答案:B知識點解析:程序只輸出字母ASCII值為奇數(shù)的字母,根據(jù)字母B,Y,T,E的ASCII值的奇偶性相應(yīng)輸出。18、有以下程序#includevoidfun(char**p){++p;printf("%s\n",*p);}main(){char*a[]=("Morning","Afternoon","Even~ng","Night");fun(a);}程序的運行結(jié)果是A、ftemoonB、MorningC、orningD、Aftemoon標(biāo)準(zhǔn)答案:D知識點解析:在程序中,指針的指針變量a和p都是指向字符串的指針。執(zhí)行fun(a)語句時,p指向的是字符串?dāng)?shù)組a的第一個字符串“Morning”,p自加1之后,*p指向了字符串?dāng)?shù)組a的第2個字符串“Afternoon”。19、有以下程序voidfunl(char*p){char*q;q=p;while(*q!=’\0’){(*q)++;q++;}}main_(){chara[]={"Program"),*p;p=&a[3];fun1(p);printf("%s\n",a);}程序執(zhí)行后的輸出結(jié)果是A、PrphsbnB、ProhsbnC、ProgsbnD、Program標(biāo)準(zhǔn)答案:B知識點解析:在函數(shù)voidfunl(char*p)中,語句(*q)++的功能是q所指的字符加1,變成其后而的字符;q++就是指針q指向下一個字符的位置。所以在主函數(shù)中,語句p=&a[3]的作用是使指針p指向字符數(shù)組a[]中的第四個字符的位置,即p指向字符’g’;然后調(diào)用函數(shù)fun1(p)后,字符’g’變成’h’,字符’r’變成’s’,字符’a’變成’b’,字符’m’變成’n’,因而字符數(shù)組a[]中的內(nèi)容就成“Prohsbn”。20、有以下程序#includevoidfun(char*a,char*b){while(*a==’*’)a++;while(*b=*a){b++;a++;)}main(){char*s="*****a*b****",t[80];fun(s,t);putS(t);}程序的運行結(jié)果是A、a*bB、*****a*bC、a*b****D、ab標(biāo)準(zhǔn)答案:C知識點解析:主函數(shù)main()定義了指向字符串的指針和一個字符數(shù)組,接著調(diào)用fun(s,t)函數(shù),進(jìn)行實參向形參傳遞,雨數(shù)fun()第一個while語句判斷*a中的值為“*”時繼續(xù)掃描,當(dāng)遇到不是“*”時結(jié)束,接著第二個while循環(huán)語句,將*a中從“a”開始的后續(xù)所有字符都賦予*b,也就是t[80]中的內(nèi)容為“a*b****”。21、下列函數(shù)的功能是voidfun(char*a,char*b){while((*b=*a)!=’\0’){a++;b++;}}A、使指針b指向a所指字符串B、將a所指字符串和b所指字符串進(jìn)行比較C、將a所指字符串賦給b所指空間D、檢查a和b所指字符串中是否有’\0’標(biāo)準(zhǔn)答案:C知識點解析:存while語句的條件中是把字符*a的值賦給字符*b,然后再判斷字符*b的值是否等于字符串的結(jié)束字符(’\0’),當(dāng)不等于結(jié)束字符(’\0’)時,把字符指針變量a,b分別加1,指它們的下一個字符,直到字符串a(chǎn)的結(jié)束。這樣程序執(zhí)行的結(jié)果就是把字符串a(chǎn)賦給了b所指的存儲空間。22、有以下程序#include#includevoidfun(chars[][10],intn){chart;inti,j;for(i=0;is[j][0]){t=s[i][0];s[i][0]=s[j][0];s[j][0]=t;}}main(){charss[5][10]={"bcc","bbcc","xy","aaaacc","aabcc");fun(ss,5);printf("%s,%s\n",ss[0],ss[4]};}程序的運行結(jié)果是A、aaaacc,xyB、bcc,aabccC、xy,aaaaccD、aabcc,bcc標(biāo)準(zhǔn)答案:C知識點解析:函數(shù)fun(chars[][10],intn)通過兩重for循環(huán)語句,比較二維字符數(shù)組s[][10]的每個字符串的首字符大小,如果前一個字符串首字符大于后一個字符串的首字符,則交換這兩個字符串的首字符。在豐函數(shù)中,語句fun(ss,5)的作用是對二維字符數(shù)組ss[5][10]的5個字符串的首字符進(jìn)行從小到大的排序,不影響各個字符串另外的字符。所以排序結(jié)束后,5個字符串的第一個字符依次變?yōu)閍、a、b、b和x;最后輸出第1個和第4個字符串。23、有以下程序#includevoidfun(char*t,char*s){while(*t!=0)t++;while((*t++=*s++)!=0),}maiin_(){charss[10]="acc",aa[10]="bbxxyy";fun(ss,aa);printf("%s,%s\n",ss,aa);}程序的運行結(jié)果是A、acc,bbxxyyB、accxxyy,bbxxyyC、accbbxxyy,bbxxyyD、accxyy,bbxxyy標(biāo)準(zhǔn)答案:C知識點解析:fun函數(shù)中,第1個while循環(huán)語句使指針t指向字符串的末尾,第2個while循環(huán)語句實現(xiàn)了字符串t和s的連接。主函數(shù)中語句。fun(ss,aa)的功能是將字符串a(chǎn)a連接到字符串ss的末尾。24、有以下程序#include#includevoidfun(char*w,intm){chars,*p1,*p2;p1=w;p2=w+m-1;while(p1A、116611B、161616C、654321D、123456標(biāo)準(zhǔn)答案:C知識點解析:函數(shù)fun的功能是將字符串w中的元素從大到小進(jìn)行排列,所以在主函數(shù)中調(diào)用函數(shù)fun后,字符串a(chǎn)的元素從大到小進(jìn)行了排列。25、有以下程序:#includeintb=2;intfun(int‘k){b=*k+b;return(b);}main(){inta[10]={1,2,3,4,5,6,7,8),i;for(i=2;i<4;i++){b=fun(&a[i])+b;printf("%d",b);)printf("\n");}程序運行后的輸出結(jié)果是A、810B、1028C、1012D、1016標(biāo)準(zhǔn)答案:B知識點解析:i=2時,fun(&a[2])返回值是b=b+a[1]=2+3=5,b=b+b=5+5=10;i=3時,fun(&a[3])返回值是b=b+a[3]=10+4=14,b=b+b=14+14=28。26、有以下程序#include#inoludevoidfun(int*p1,int*p2,int*s){s=(int*)calloc(1,sizeof(int));*s=*p1+*p2;free(s);}main(){inta[2]={1,2},b[2]={40,50},*q=a;fun(a,b,q);printf("%d\n",*q);}程序運行后的輸出結(jié)果是A、41B、42C、0D、1標(biāo)準(zhǔn)答案:A知識點解析:主函數(shù)定義數(shù)組a,b,q指向數(shù)組a,調(diào)用fun函數(shù)以后形參接收實參的數(shù)據(jù),p1和p2指向數(shù)組a和b,同時s指向數(shù)組a,在fun函數(shù)中改變了s的指向和賦值,但是在程序調(diào)用結(jié)束之間形參空間全部釋放,因此對于s的指向改動不會對主函數(shù)參數(shù)構(gòu)成影響。因此主函數(shù)中數(shù)去*q的值仍然為1。國家二級C語言(編譯預(yù)處理和指針)機試模擬試卷第4套一、選擇題(本題共26題,每題1.0分,共26分。)1、設(shè)有定義:intx=0,*p;緊接著的賦值語句正確的是A、*p=NULL;B、p=NULL;C、p=x;D、*p=x;標(biāo)準(zhǔn)答案:A知識點解析:定義指針變量時,必須將指針變量初始化為NULL(為空),否則,如果不賦給它地址,系統(tǒng)會隨機給它分配一個地址。2、以下敘述中錯誤的是A、函數(shù)可以返回地址值B、改變函數(shù)形參的值,不會改變對應(yīng)實參的值C、當(dāng)在程序的開頭包含頭文件stdio.h時,可以給指針變量賦NULLD、可以給指針變量賦一個整數(shù)作為地址值標(biāo)準(zhǔn)答案:D知識點解析:指針變量的值只能是存儲單元地址,而不能是一個整數(shù),選項D的描述是錯誤,為待選答案。函數(shù)可以返回內(nèi)存空間的地址,同時函數(shù)形參和實參分別占用不同的內(nèi)存單元,改變形參的值不會改變對應(yīng)實參的值,在頭文件stdio.h中,NULL被定義為void型的指針。3、設(shè)已有定義:floatx;則以下對指針變量p進(jìn)行定義且賦初值的語句中正確的是A、int*p=(float)x;B、float*p=&x;C、floatp=&x;D、float*p=1024;標(biāo)準(zhǔn)答案:B知識點解析:定義指針變量的一般形式為:類型名*指針變量名1,*指針變量名2,……;。對一個指針變量賦值要通過求地址運算符(&)獲得變量的地址值,然后把此地址值賦給指針變量。因而在選項A的表達(dá)式中,賦值號的左邊表示定義了指針變量p,而右邊表示求變量x的地址值。4、有以下程序main(){intm=1,n=2,*p=&m,*q=&n,*r;r=p;p=q;q=r;printf("%d,%d,%d,%d\n",m,n,*p,*q);}程序運行后的輸出結(jié)果是A、1,2,1,2B、1,2,2,1C、2,1,2,1D、2,1,1,2標(biāo)準(zhǔn)答案:B知識點解析:在主函數(shù)定義了3個整數(shù)指針變量p,q,r,并且使p指向m,q指向n,再執(zhí)行r=p;p=q;q=r;這三條語句,使q指向m,p指向n,再輸出變量m,n,*p,*q時,它們值分別為1,2,2,1。5、下面選項中的程序段,沒有編譯錯誤的是A、char*sp,s[10];sp="Hello";B、char*sp,s[10];s="Hello";C、charstr1[10]="computer",str2[10];str2=str1;D、charmark[];mark="PROGRAM";標(biāo)準(zhǔn)答案:A知識點解析:選項B中數(shù)組名為常量,不能賦值,選項C字符數(shù)組之間無法完成賦值操作,選項D和選項B相同,無法對數(shù)組進(jìn)行賦值。6、設(shè)有定義doublea[10],*s=a;以下能夠代表數(shù)組元素a[3]的是A、(*s)[3]B、*s[3]C、*s+3D、*(s+3)標(biāo)準(zhǔn)答案:D知識點解析:語句*s=a,使用指針變量s指向一維數(shù)組a的首地址,所以*(s+3)表示的是引用數(shù)組a[3]。7、有以下程序main(){inta=1,b=3,c=5;int*p1=&a,*p2=&b,*p=&c;*p=*p1*(*p2);printf("%d\n",c);}執(zhí)行后的輸出結(jié)果是A、2B、3C、1D、4標(biāo)準(zhǔn)答案:B知識點解析:程序使整型指針p1、p2、p3指向a、b、c值所存放的地址空間。然后再將指針變量*p1、*p2中的值的乘積賦給指針變量*p,即賦給變量c,輸出c的值3。8、若有定義語句:inta[2][3],*p[3];則以下語句中正確的是A、p[0]=&a[1][2];B、p[0]=a;C、p=a;D、p[1]=&a;標(biāo)準(zhǔn)答案:A知識點解析:定義語句inta[2][3],*p[3];定義了整型二維數(shù)組a[2][3]和指針數(shù)組p[3]。在C語言中,二維數(shù)組名也是一個存放地址常量的指針,其值為二維數(shù)組中第一行的地址。所以選項A中,把整型數(shù)組a[0]的指針賦給p[0]。9、若有定義語句:intyear=2009,*p=&year;以下不能使變量year中的值增至2010的語句是A、(*p)++;B、++(*p);C、*p++;D、*p+=1;標(biāo)準(zhǔn)答案:C知識點解析:由于自加運算符++的運算級高于間接運算*的運算級,所以選項A)的表達(dá)式*p++不能使變量year中的值增至2010。10、有以下程序main(){inta[5]={2,4,6,8,10},*p,**k;p=a;k=&p;printf("%d",*(p++));printf("%d\n",**k);}程序運行后的輸出結(jié)果是A、44B、24C、22D、46標(biāo)準(zhǔn)答案:B知識點解析:主函數(shù)中指針變量p指向數(shù)組a中下標(biāo)為0的元素,k指向p,那么*(p++)的值為2,p指向數(shù)組中下標(biāo)為1的元素,k指向p,所以**k的值為4。11、以下敘述中正確的是A、如果p是指針變量,則*p表示變量p的地址值B、如果p是指針變量,則&p是不合法的表達(dá)式C、在對指針進(jìn)行加、減算術(shù)運算時,數(shù)字1表示1個存儲單元的長度D、如果p是指針變量,則*p+1和*(p+1)的效果是一樣的標(biāo)準(zhǔn)答案:C知識點解析:移動指針是對指針變量加上或減去一個整數(shù),或通過賦值運算,使指針變量指向相鄰的存儲單元。因此,只有當(dāng)指針指向一串連續(xù)的存儲單元時,指針的移動才有意義。當(dāng)指針指向一串連續(xù)的存儲單元時,可以對指針變量進(jìn)行加上或減去一個整數(shù)的運算,也可以對指向同一串連續(xù)存儲單元的兩個指針進(jìn)行相減的運算。除此之外,不可以對指針進(jìn)行任何其他的算術(shù)運算。C語言提供了一個間接訪問運算符(*),又稱間址運算符,它是一個單目運算符,優(yōu)先級比較高,高于普通的算術(shù)運算符,但是低于()運算符,因此*p+1和*(p+1)的含義是不一樣。當(dāng)指針變量中12、有以下程序(注:字符a的ASCII碼值為97)main(){char*s={"abc"};do{printf("%d",*s%10);++s;}while(*s);}程序運行后的輸出結(jié)果是A、abcB、7890C、979899D、789標(biāo)準(zhǔn)答案:D知識點解析:因為小寫字符a,b,c的ASCII的值分別為97,98,99,而在dowhile循環(huán)語句中,每次對字符的ASCII的值取余數(shù)并輸出,第一次循環(huán)輸出7,第二次循環(huán)

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論