全国计算机等级考试二级C模拟试题(4)
(35)C语言中,形参的默认存储类是
A)auto
b)register
C)static
d)extern
[答案]A
[解析]本题考核。在C语言中,形参的默认存储类是auto。
(36)如果已经正确定义了指针P,不正确的说法是
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()函数的调用格式为“malloc(n)”,用于申请N个字符的存储单元,以存储区的第一个地址作为返回值。实际调用时,可以在它前面加上“(类型说明符*)”,将其转换成所需的类型地址。选项d多了一个参数,不符合malloc()函数的调用格式;整数变量在某些计算机系统中占4个字节,但不一定在所有计算机系统中都是2个字节;选项A是申请一个整数存储空,将这个存储的第一个地址空乘以2。这是不正确的,存储空是连续存储空地址的两倍再乘以2。
(37)下面这个程序的输出结果是
main()
{ char x = 040;
printf("%o\n ",x < < 1);
}
A)100
B)80
C)64
D)32
[答案]A
[解析]首先将八进制040转换为二进制。
(38)要打开A盘的user子目录中名为abc.txt的文本文件进行读写,下面满足这个要求的函数调用是
a) fopen ("a: \ user \ abc.txt "," r")
b) fopen ("a: \ \ "r+"
c)fopen(" a:\ user \ ABC . txt "," Rb ")
d)fopen(" a:\ \ user \ \ ABC . txt "," w") [/br/因为" \ "是转义符,文件名中的" \ "用" \ "表示。要打开文本文件进行读写,应该使用读写模式“r+”。
(39)下列不能正确给字符串赋值初始值的语句是
a) charstr [5] = "good!";
B)char str[]= "好!";
C)char *str= "好!";
D)char str[5]={'g ',' o ',' o ',' D ' };
[答案]A
[解析]选项A定义了一个五元素的字符数组str,但赋初值时,初值个数为六(有一个' [6] ',);选项B定义了一个字符数组字符串,并赋予它一个初始值。因为省略了长度的定义,所以长度由初始值的个数决定,相当于STR[6];选项C定义了一个字符指针变量,用字符串给它赋一个初始值,使字符指针指向字符串;选项d是将初始值依次分配给字符数组中的各个元素。
(40)如果有以下描述和定义:
struct test
{ int ml;char m2浮动m3;
union uu { char ul[5];int U2[2];} ua
} myaa;
那么sizeof(struct test)的值就是
A)12
b)16
c)14
d)9
[答案]A
[解析不过,社区占用的内存空就是成员占用的内存空。社区类型uu是结构的成员,它的内存长度是成员的长度,也就是字符数组u1的长度,也就是1×5=5。每个整数数据占用2个字节,每个字符数据占用1个字节,单精度数据占用4个字节。myaa是一个结构变量,它的storage 空是每个成员的storage 空之和,即2+1+4+5=12。
(41)如果有定义:Intaa[8];。不能用下面的表达式表示的数组元素AA [1]的地址是
a)&AA [0]+1
b)& AA[1]
c)& AA[0]+
d)AA+1
数组中第一个元素的地址用& AA[0]表示,它的等价形式是& AA[0]++;选项a是数组第一个元素的地址,第二个元素aa[l]的地址下移一位;b也是数组第二个元素的地址。选项D中,aa表示数组的地址,加1表示数组的第一个地址移位一位,表示数组元素中第二个元素aa[1]的地址。
(42)下面这个程序的输出结果是
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()函数中定义一个执行函数调用f(a,3,7),将A的首地址赋给参数B,将3和7分别赋给参数m和n。在f()函数中,for循环执行了两次:第一次,I的值为3,相当于语句“s=s+b[3]”的执行。b[3]的值是a[3]的值4,所以S的值变成4;第二次,I的值是5,相当于语句“S = S+B [5]”的执行,b[5]的值是6,所以s的值变成了10。将s作为函数值返回,并将其赋给x。
(43)如果有以下定义和陈述:
int s [4] [5],(* PS)[5];
PS = s;
S数组元素的正确引用形式是
a)PS+1
b)*(PS+3)
c)PS[0][2]
d)*(PS+1)+3[此时数组元素s[i][j]的地址为“*(ps+i)+j”,数组元素s[i][j]可表示为*(*(ps+i)+j)。选项B表示数组元素a[3][0]的地址;选项d表示数组元素s[1][3]的地址;选项A中的“ps+1”是指向下一行(第二行)的地址;选项C中,ps[0][2]无条件等价于“*(ps[0]+2)”和“*(*(ps+0)+2”,即数组元素s[0][2]。
(44)下面这个程序的输出结果是
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
[解析]本题定义、初始化、定义一个二维数组B。然后通过一个双循环把几个元素的值加到变量t上。循环的执行步骤是:当外循环变量i=0时,内循环变量j=i执行语句“T = T+B [I] [B [J] [J]”,相当于t=t+b[0][b[0][0]]。因为类比b[0][0]的值,循环执行3次,最后t的值是4。
(45)下面这个程序的输出结果是
# include < stdio . h >
# include < string . h >
main()
{ char B1[8]= " abcdefg ",b2 [8],。
while( - pb>=b1)strcpy(b2,Pb);
printf("%d\n ",strlen(B2));
}
A)8
B)3
C)1
D)7
[答案] D
[Parse] strcpy()函数用于使第二个首先定义两个字符数组b1和b2,b1由一个字符串赋予一个初始值。然后定义一个字符指针变量pb,通过给一个初始值指向b1[3]。然后执行一个while循环,执行三次:第一次判断条件“-pb > = B1”,使pb的值为“b1+2”,执行“strcpy(b2,Pb)”。之后b2中的内容为“CDEFG”;第二个判断条件“-pb > = B1”使pb的值为“b1+1”,执行“strcpy(b2,Pb);”b2之后的内容是“bcdefg”。第三个判断条件“-pb > = b1”使pb的值为“b1”,执行“strcpy(b2,Pb);”b2后面的内容是“abcdefg”。存储在输出b2数组中的字符串长度显然是7。(这里还有一个重点:每执行一次while循环判断条件就执行一次“- pb”,使指针pb减1,即前移一位)。
(46)解释性语句中:int * f();,标识符F表示
A)指向整数数据的指针变量
B)指向一维数组的行指针
C)指向函数的指针变量
D)返回值为pointer的函数名
[答案] d [/]以int(*指针变量名称[长度])的形式定义指向整数一维数组的行指针,以int(*函数名) ()的形式定义返回值为整数的函数的指针变量,以及指针函数本体定义了一个函数f(),其返回值是指针类型。
(47)main函数命令行参数的非法表达式是
a) main (int a,char * c [])
b) main (int arc,char * * ARV)
c) main (int argc,Char * argv)[/br Char * argc[]]
[答案]C
[Parse]main()函数可以带参数,而且只能有两个参数。第一个参数类型是integer,用来记下命令行上参数的个数;第二个参数是字符指针数组,或者字符指针变量(指向一个数组,数组元素是一级字符指针),它的元素用来记录来自命令行的每个参数字符串的第一个地址。因此,只有本题中的选项C不符合要求。
(48)下面这个程序的输出结果是
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,并赋予它一个初值。第一次调用incre(),定义一个静态变量x并赋给它一个初始值1,然后执行“x*=x+1”使x的值变成2;第二次调用incre()函数时,静态变量将保留上次退出的值,即2。执行语句“x*=x+1”后,x的值变成6,x的输出值是6。
(49)如果有如下定义:
struct link
{ int data;
struct link * next;
}a,b,c,*p,* q;
并且变量A和B之间存在如下图所示的链表结构:指针P指向变量A,Q指向变量C .那么可以在A和B之间插入C并形成新链表的语句组是
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,要在变量A和变量B之间插入C,首先要将变量A的指针字段指向变量C,即(*p)。next=q,然后将变量C的指针字段指向变量B,即(* q)。下一个=&b。
(50)下面的解释性语句
typedef struct
{ int n;
char ch[8];
} PER;
那么下列说法是正确的
A)PER是结构变量名
B)PER是结构类型名
C)typedef struct是结构类型
D)struct是结构类型名
[答案] B
0条评论