07年4月等級考試二級C語言練習(xí)一[3]

字號:

(35)在C語言中,形參的缺省存儲類是
     A)auto
     B)register
     C)static
     D)extern
     【答案】A
     【解析】本題考核的知識點(diǎn)是定義函數(shù)時形參的缺省存儲類。在C語言中,形參的缺省存儲類為auto。
     (36)若指針p已正確定義,要使p指向兩個連續(xù)的整型動態(tài)存儲單位,不正確的語句是
     A)p=2*(int *)malloc(sizeof(int));
     B)p=(int *)malloc(2*sizeof(int));
     C)p=(int *)malloc(2*2);
     D)p=(int *)malloc(2,sizeof(int));
     【答案】A
     【解析】malloc()函數(shù)的調(diào)用格式是“malloc(n)”,作用是申請n個字符的存儲單元并把該存儲區(qū)的首地址作為返回值,實際調(diào)用的時候可在前面加上“(類型說明符*)”,以轉(zhuǎn)換成需要的類型的地址。選項D多了一個參數(shù),不符合malloc()函數(shù)的調(diào)用格式;整型變量在有的計算機(jī)系統(tǒng)里占4個字節(jié),并不一定在所有的計算機(jī)系統(tǒng)里都是兩個字節(jié);選項A中是申請一個整型的存儲空間并把該存儲空間的首地址乘以2,這樣的做法是不正確的,其存儲空間為沒乘以2之前的存儲空間的2倍的連續(xù)存儲空間的地址。
     (37)以下程序的輸出結(jié)果是
     main()
     { char x=040;
     printf("%o\n",x<<1);
     }
     A)100
     B)80
     C)64
     D)32
     【答案】A
     【解析】首先將八進(jìn)制040轉(zhuǎn)換成二進(jìn)制數(shù)000100000,再將此二進(jìn)制數(shù)左移一位為001000000,輸出時轉(zhuǎn)換成八進(jìn)制數(shù)100。
     (38)若要打開A盤上user子目錄下名為abc.txt的文本文件進(jìn)行讀、寫操作,下面符合此要求的函數(shù)調(diào)用是
     A)fopen("A:\user\abc.txt", "r")
     B)fopen("A:\\user\\abc.txt", "r+")
     C)fopen("A:\user\abc.txt", "rb")
     D)fopen("A:\\user\\abc.txt","w")
     【答案】B
     【解析】本題考核的知識點(diǎn)是文件名的表示法以及文件的讀寫模式。由于“\”是轉(zhuǎn)義字符,所以在文件名中的“\”用“\\”來表示。要打開文本文件進(jìn)行讀寫,應(yīng)使用讀寫模式“r+”。
     (39)以下不能正確進(jìn)行字符串賦初值的語句是
     A)char str[5]="good! ";
     B)char str[]="good! ";
     C)char *str="good! ";
     D)char str[5]={'g', 'o', 'o', 'd'};
     【答案】A
     【解析】選項A定義了一個字符數(shù)組str,具有5個元素,但賦初值的時候,初值個數(shù)卻是6個(有一個'\0',);選項B定義了一個字符數(shù)組str并給它賦初值,由于省去了長度定義,長度由初值個數(shù)確定,相當(dāng)于str[6];選項C定義了一個字符型指針變量并用一個字符串給它賦初值,使該字符型指針指向了該字符串;選項D是對字符型數(shù)組中單個元素依次賦初值。
     (40)若有下面的說明和定義:
     struct test
     { int ml;char m2;float m3;
     union uu{char ul[5];int u2[2];} ua;
     } myaa;
     則 sizeof(struct test)的值是
     A)12
     B)16
     C)14
     D)9
     【答案】A
     【解析】結(jié)構(gòu)體所占用的存儲空間是其所有成員占用的存儲空間之和,而共用體所占用的存儲空間是成員中占用存儲空間者的空間,共用體類型uu是結(jié)構(gòu)體的成員,它所占的內(nèi)存長度為成員的長度,即字符型數(shù)組u1的長度,即1×5=5。每個整型數(shù)據(jù)占用2個字節(jié),每個字符型數(shù)據(jù)占用一個字節(jié),單精度型數(shù)據(jù)占4個字節(jié),myaa為結(jié)構(gòu)體變量,它所占的存儲空間為各個成員所占存儲空間之和,即2+1+4+5=12。
     (41)若有定義:int aa[8];。則以下表達(dá)式中不能代表數(shù)組元素aa[1]的地址是
     A)&aa[0]+1
     B)&aa[1]
     C)&aa[0]++
     D)aa+1
     【答案】C
     【解析】在C語言中,數(shù)組的地址和數(shù)組中的第一個元素的地址相同。數(shù)組中第一個元素地址的表示方法為&aa[0],與其等價的有&aa[0]++;選項A為數(shù)組的第1個元素的地址下移一位即是第二個元素aa[l]的地址;B也為數(shù)組的第二個元素的地址,選項D中aa表示數(shù)組的地址,加1表示數(shù)組首地址后移一位,即代表數(shù)組元素中的第二個元素aa[1]的地址。
     (42)以下程序的輸出結(jié)果是
     f(int b[],int m,int n)
     { int i,s=0;
     for (i=m;i<n;i=i+2)s=s+b[i];
     return s;
     }
     main()
     { int x,a[]={1,2,3,4,5,6,7,8,9};
     x=f(a,3,7);
     printf("%d\n",x);
     }
     A)10
     B)18
     C)8
     D)15
     【答案】A
     【解析】在main()函數(shù)中定義了一個變量x,以及一個有9個元素的數(shù)組a,并且每個元素分別賦初值為1、2、3、4、5、6、7、8和9。執(zhí)行函數(shù)調(diào)用f(a,3,7),把a(bǔ)的首地址賦給形參b,把3和7分別賦給形參m和n。在f()函數(shù)中,for循環(huán)執(zhí)行了2次:第一次,i的值為3,相當(dāng)于執(zhí)行了語句“s=s+b[3]”,b[3]的值就是a[3]的值4,故s的值變?yōu)?;第二次,i值為5,相當(dāng)于執(zhí)行了語句“s=s+b[5];”,b[5]的值為6,故s的值變?yōu)?0。把s作為函數(shù)值返回并賦值給x。
     (43)若有以下定義和語句:
     int s[4][5],(*ps)[5];
     ps=s;
     則對s數(shù)組元數(shù)的正確引用形式是
     A)ps+1
     B)*(ps+3)
     C)ps[0][2]
     D)*(ps+1)+3
     【答案】C
     【解析】本題首先定義了一個4行5列的數(shù)組s,又定義了一個指向由5個元素組成的一維數(shù)組的指針變量ps,通過賦值讓ps指向了數(shù)組s的首地址。此時數(shù)組元素s[i][j]的地址為“*(ps+i)+j”,數(shù)組元素s[i][j]可表示為*(*(ps+i)+j)。選項B表示的是數(shù)組元素a[3][0]的地址;選項D表示的是數(shù)組元素s[1][3]的地址;選項A中“ps+1”為指向下一行(第二行)的地址;選項C中ps[0][2]無條件等價于“*(ps[0]+2)”又無條件等價于“*(*(ps+0)+2)”,即是數(shù)組元素s[0][2]。
     (44)以下程序的輸出結(jié)果是
     main()
     { int b[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=1;
     for (i=0;i<3;i++)
     for(j=i;j<=i;j++)t=t+b[i][b[j][j]];
     printf("%d\n",t);
     }
     A)3
     B)4
     C)1
     D)9
     【答案】B
     【解析】本題中定義了一個二維數(shù)組b并初始化,定義了一個變量t并賦初值1。接著通過一個二重循環(huán)將若干個元素的值加到變量t中。循環(huán)的執(zhí)行步驟是:外層循環(huán)變量i=0時,內(nèi)層循環(huán)變量j=i執(zhí)行語句“t=t+b[i][b[j][j]]”,相當(dāng)于t=t+b[0][b[0][0]],由于b[0][0]的值為0,得到t的值為1;依次類推,循環(huán)共執(zhí)行了3次,最后輸出t的值為4。
     (45)以下程序的輸出結(jié)果是
     #include <stdio.h>
     #include <string.h>
     main()
     { char b1[8]="abcdefg",b2[8],*pb=b1+3;
     while(--pb>=b1)strcpy(b2,pb);
     printf("%d\n",strlen(b2));
     }
     A)8
     B)3
     C)1
     D)7
     【答案】D
     【解析】strcpy()函數(shù)的作用是把第二個參數(shù)代表的字符串,復(fù)制到第一個參數(shù)指向數(shù)組中。首先定義了兩個字符數(shù)組b1和b2,并用一個字符串給b1賦初值,然后定義了一個字符型指針變量pb,通過賦初值使它指向b1[3]。接著執(zhí)行while循環(huán),該循環(huán)執(zhí)行了3次:第一次判斷條件“--pb>=b1”,使pb的值為“b1+2”,執(zhí)行“strcpy(b2,pb);”后,b2中的內(nèi)容為“cdefg”;第二次判斷條件“--pb>=b1”,使pb的值為“b1+1”,執(zhí)行“strcpy(b2,pb);”后b2的內(nèi)容為“bcdefg”第三次判斷條件“--pb>=b1”使pb的值為“b1”,執(zhí)行“strcpy(b2,pb);”后b2的內(nèi)容為“abcdefg”。最后輸出b2數(shù)組中存放的字符串長度,顯然是7。(這里還有一個關(guān)鍵點(diǎn):就是每當(dāng)執(zhí)行一次while循環(huán)判斷條件,就執(zhí)行一次“--pb”,使得指針pb自減1,即前移一位)。
     (46)在說明語句:int *f();中,標(biāo)識符f代表的是
     A)一個用于指向整型數(shù)據(jù)的指針變量
     B)一個用于指向一維數(shù)組的行指針
     C)一個用于指向函數(shù)的指針變量
     D)一個返回值為指針型的函數(shù)名
     【答案】D
     【解析】定義指向整型元素的指針變量形式為:int*指針變量名。定義指向整型一維數(shù)組的行指針形式為:int(*指針變量名[長度],定義指向返回值為整型的函數(shù)的指針變量的形式為:int(*函數(shù)名)(),定義返回值為指向整型的指針型函數(shù)的形式為:int *函數(shù)名()。本題定義的是一個返回值為指針型的函數(shù)f()。
     (47)不合法的main函數(shù)命令行參數(shù)表示形式是
     A)main(int a,char *c[])
     B)main(int arc,char **arv)
     C)main(int argc,char *argv)
     D)main(int argv,char *argc[])
     【答案】C
     【解析】main()函數(shù)可以帶有參數(shù),并且參數(shù)只能有兩個,第一個參數(shù)類型為整型,用來記下命令行的參數(shù)個數(shù);第二個參數(shù)為一個字符型指針數(shù)組,或字符型二級指針變量(指向一個數(shù)組,數(shù)組元素又是一個一級字符指針),其各個元素用來記下從命令行各參數(shù)字符串的首地址。故本題只有C選項不符合要求。
     (48)以下程序的輸出結(jié)果是
     int x=3;
     main()
     { int i;
     for(i=1;i<x;i++)incre();
     }
     incre()
     { static int x=1;
     x*=x+1;
     printf("%d",x);
     }
     A)3 3
     B)2 2
     C)2 6
     D)2 5
     【答案】C
     【解析】本題首先定義一個全局變量x并賦初值為3,主函數(shù)中使用這個全局變量控制循環(huán)次數(shù),循環(huán)執(zhí)行了2次,調(diào)用兩次incre()函數(shù)。第一次調(diào)用incre(),定義一個靜態(tài)變量x并賦初值1,然后執(zhí)行“x*=x+1”,使x的值變?yōu)?;第二次調(diào)用incre()函數(shù)時,靜態(tài)變量將保留上一次退出時的值即2,執(zhí)行語句“x*=x+1”后,x的值變成6,輸出x的值為6。
     (49)若有以下定義:
     struct link
     { int data;
     struct link *next;
     }a,b,c,*p,*q;
     且變量a和b之間已有如下圖所示的鏈表結(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;
     【答案】D
     【解析】在本題中指針p指向變量a,q指向變量c。要把c插入到變量a和變量b之間,就應(yīng)該首先讓變量a的指針域指向變量c,即(*p).next=q,然后讓變量c的指針域指向變量b,即(*q).next=&b。
     (50)設(shè)有以下說明語句
     typedef struct
     { int n;
     char ch[8];
     } PER;
     則下面敘述中正確的是
     A)PER是結(jié)構(gòu)體變量名
     B)PER是結(jié)構(gòu)體類型名
     C)typedef struct是結(jié)構(gòu)體類型
     D)struct是結(jié)構(gòu)體類型名
     【答案】B
     【解析】本題通過typedef在定義一個結(jié)構(gòu)體類型的同時,把它自定義成類型名PER,故PER是結(jié)構(gòu)體類型名。