国家二级C语言机试(函数和数组)模拟试卷22
国家二级C语言机试(函数和数组)模拟试卷22
(总分:58.00,做题时间:90分钟)
一、选择题(总题数:29,分数:58.00)
1.有以下程序#include main(){ int c[6]={10,20,30,40,50,60},*p,*s;p=c;s=&c[5];printf("%d\n",s-p);} 程序运行后的输出结果是
(分数:2.00)
A.50
B.6
C.5 √
D.60
解析:解析:主函数中指针变量p指向数组c,s保存了数组最后一个元素的地址,那么s中为两个地址之间的元素差5。
2.以下叙述中正确的是
(分数:2.00)
A.一条语句只能定义一个数组
B.数组说明符的一对方括号中只能使用整型常量,而不能使用表达式
C.每个数组包含一组具有同一类型的变量,这些变量在内存中占有连续的存储单元√
D.在引用数组元素时,下标表达式可以使用浮点数
解析:解析:数组的定义格式:类型说明符数组名[整型常量表达式]….;可以同时定义多个类型相同的数组,之间以逗号分隔开,数组的类型表明了数组中元素的数据类型,数组中所有元素的类型相同,数组经过定义以后就可使用,编译程序将对其分配一片连续的存储空间进行连续存储。C语言中只能单个引用数组元素而不能一次引用整个数组。引用格式为:
数组名[下标],引用元素时,需要注意下标只能为整型常量或整型表达式。
3.以下叙述中正确的是
(分数:2.00)
A.语句int a[]={0};是不合法的,遗漏了数组的大小
B.语句char a[2]={"A","B"};是合法的,定义了一个包含两个字符的数组
C.语句int a[8]={0};是合法的√
D.语句char a[3];a="AB";是合法的,因为数组有三个字符空间的容量,可以保存两个字符
解析:解析:当系统为所定义的数组在内存中开辟~串连续的存储单元时,这些存储单元中并没有确定的值,可以在定义语句中为所定义数组的各个元素赋初值。数组初始化赋值是指在数组定义时给数组元素赋予初值。初始化赋值的一般形式为:类型说明符数组名[常量表达式]={值,值,…,值};。需要注意的是当所赋初值多于所定义数组的元素个数时,在编译时将给出出错信息,在指定初值时,第一个初值必定赋给下标为0的元素,然后按这些数值
的排列顺序赋初值,只能给元素逐个赋值,不能给数组整体赋值。如果给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。
4.如果定义float a[10],x;则以下叙述中正确的是
(分数:2.00)
A.表达式a+1是非法的
B.语句a=&x;是非法的√
C.三个表达式a[1]、*(a+1)、*&a[1]表示的意思完全不同
D.表达式*&a[1]是非法的,应该写成*(&(a[1]))
解析:解析:定义语句“float a[10],x;”以后,数组名a表示了数组元素的首地址,是常量在程序中不能更改,因此选项A是的描述是正确的。而指向运算符和取址运算符,是互反运算符优先级相同,*&a[1]和*(&a[1])含义相I司。
5.有以下程序#include main() {int a[]={10,20,30,40},*p=a,i;for(i=0;i<=3;i++){a[i]=*p;p++;} printf("%d\n",a[2]);} 程序运行后的输出结果是
(分数:2.00)
A.20
B.30 √
C.10
D.40
解析:解析:因为指针变量p的初始值指向数组a,所以执行for循环语句后,数组a中的元素的值不变。
6.若有以下程序 main(){int i,j=0; char a[]="How are you!"; for(i=0;a[i];i++)
if(a[i]!='')aD++]=a[i]; a[j]='\0'; printf("%s\n",a);} 则程序的输出结果是
(分数:2.00)
A.Howareyou
B.Hay!
C.Howareyou! √
D.How are you!
解析:解析:主函数中利用for循环访问字符串的每一个字符,判断当前字符是否为空格,如果是空格则删除。因此删除字符串"How arc you!"中空格以后,字符串为Howareyou!。
7.若有以下程序 #include main(){int i,j=0; char a[]="How are you!",b[10]; for(i=0;a[i];i++) if(a[i]=='')b[j++]=a[i+1]; b[j]='\0'; printf("%s\n",b);} 则程序的输出结果是
(分数:2.00)
A.Howareyou
B.Hay!
C.Howareyou!
D.ay √
解析:解析:主函数中利用for循环访问字符串a的每一个字符,判断当前字符是否为空格,如果是空格则保存该空格后面的一个字符存放到字符数组b中。在字符串”How are you!”中,第一个空格后面字符为'a',第二个空格后面字符为'y'。
以下()是不正确的字符串常量
8.若有以下程序#include char*a="you",b[]="welcome#you#to#China!";main(){int i,j=0;char*p;for(i=0;b[i]!='\0';i++) {if(*a==b[i]) {p=&b[i];for 0=0;a[j]!='\0';j++) {if(a[j]!=*p)break;p++;} if(a[j]=='\0')break; }} printf("%s\n",p);} 则程序的输出结果是
(分数:2.00)
A.#you#to#China!
B.me#you#to#China!
C.#China!
D.#to#China! √
解析:解析:程序中循环部分的主要功能是,在字符串b中寻是否含有子串a,如果含有则退出,字符指针p指向该匹配子串后面的位置,利用printf函数输出则从该位置开始一直输出到字符串b的结尾。
9.以下能正确定义二维数组是
(分数:2.00)
A.int a[][3];
B.int a[][3]={2*3};√
C.int a[][3]={};
D.int a[2][3]={{1},{2},{3,4}};
解析:解析:C语言中定义二维数组,必须指定二维数组每一维的大小。选项A没有指定数组a行的大小,错误:选项B,虽然没有指定行大小,但是可以通过大括号里面的元素个数计算出行的大小为1,因此是正确的:选项C同样没有指定行的大小,也不能通过元素个数计算行的个数,错误:选项D定义的是二行三列数组,但是后面数据是三行,超出范围,所以错。
10.若有以下说明和语句 int c[4][5],(*p)[5];能够正确引用c数组元素的是
(分数:2.00)
A.p+1
B.*(p+3)
C.*(p+1)+3
D.*(p[0]+2) √
解析:解析:本题考查数组和指针,在本题中c是二维数组,指针p指向二维数组c,p其实是指向c数组的第一行。因此选项A中p+1指向c数组的第二行;选项B中,p+3表示p指向c数组的第三行,因此*(p+3)表示取出c数组第三行首元素的地址:选项C和选项B类似,表示取出数组c第二行首元素地址然后加3;选项D中p[0]+2表示数组第一行第三列元素的地址,因此*(p[0]+2)是取出该元素的值。
11.若有定义语句:int k[2][3],*pk[3];,则以下语句中正确的是
(分数:2.00)
A.pk=k;
B.pk[0]===k[1][2];√
C.pk=k[0];
D.pk[1]=k;
解析:解析:本题考查多维数组和数组指针。k是一个二维数组,pk是一个指针数组,该数
组有3个元素,每个元素都是一个指向整型对象的指针。选项A错误,等号的左边是一个数组地址,不是变量;选项B是把元素k[1][2]赋值给pk[0]:选项C中等号左边不是变量;选项D类型不匹配,pk[1]是指向一个整型对象,而k是一个二维数组首地址。
12.若有定义语句:int a[3][6];,按在内存中的存放顺序,a数组的第10个元素是
(分数:2.00)
A.a[0][4]
B.a[1][3] √
C.a[0][3]
D.a[1][4]
解析:解析:本题考查多维数组的定义和使用。a是一个二维数组,有3行6列,即每行6个元素,a的第lO个元素位于第二行的第四个位置,即a[1][3]。
13.若有定义语句:int a[2][3],*p[3];,则以下语句中正确的是
(分数:2.00)
A.p=a;
B.p[0]=a;
C.p[0]=a[1][2];√
D.p[1]=a;
解析:解析:本题考查多维数组和数组指针。a是一个二维数组,p是一个指针数组,该数组有3个元素,每个元素都是一个指向整型对象的指针。选项A错误,等号的左边是一个数组地址,不是变量;选项B数据类型不匹配,p[0]是指向一个整型对象,而a是一个二维数组首地址;选项C正确,是把元素a[1][2]赋值给p[0];选项D和选项B一样属于数据类型不匹配,p[1]是指向一个整型对象,而a是一个二维数组首地址。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。