国家二级C语言机试(函数和数组)模拟试卷22
选择题
1.有以下程序
#include
main(){
int c[6]={10,20,30,40,50,60},*p,*s;
p=c;
s=&c[5];
printf(\\(C)
A. 50
B. 6
C. 5
D. 60
解析:主函数中指针变量p指向数组c,s保存了数组最后一个元素的地址,那么s中为两个地址之间的元素差5。
2.以下叙述中正确的是(C)
A. 一条语句只能定义一个数组
B. 数组说明符的一对方括号中只能使用整型常量,而不能使用表达式
C. 每个数组包含一组具有同一类型的变量,这些变量在内存中占有连续的存储单元
D. 在引用数组元素时,下标表达式可以使用浮点数
解析:数组的定义格式:
类型说明符数组名[整型常量表达式]….;
可以同时定义多个类型相同的数组,之间以逗号分隔开,数组的类型表明了数组中元素的数据类型,数组中所有元素的类型相同,数组经过定义以后就可使用,编译程序将对其分配一片连续的存储空间进行连续存储。C语言中只能单个引用数组元素而不能一次引用整个数组。引用格式为:数组名[下标],引用元素时,需要注意下标只能为整型常量或整型表达式。
3.以下叙述中正确的是
C
解析:当系统为所定义的数组在内存中开辟~串连续的存储单元时,这些存储单元中并没有确定的值,可以在定义语句中为所定义数组的各个元素赋初值。
数组初始化赋值是指在数组定义时给数组元素赋予初值。初始化赋值的一般形式为:类型说明符 数组名[常量表达式]={值,值,…,值};。
需要注意的是当所赋初值多于所定义数组的元素个数时,在编译时将给出出错信息,在指定初值时,第一个初值必定赋给下标为0的元素,然后按这些数值的排列顺序赋初值,只能给元素逐个赋值,不能给数组整体赋值。如果给全部元素赋值,则在数组说明中, 可以不给出数组元素的个数。
4.如果定义float a[10],x;则以下叙述中正确的是(B)
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(\\(B)
A. 20
B. 30
C. 10
D. 40
解析:因为指针变量p的初始值指向数组a,所以执行for循环语句后,数组a中的元素的值不变。
6.若有以下程序
main(){int i,j=0;
char a[]=\\(C)
A. Howareyou
B. Hay!
C. Howareyou!
D. How are you!
解析:主函数中利用for循环访问字符串的每一个字符,判断当前字符是否为空格,如果是空格则删除。因此删除字符串\\
7.若有以下程序
#include
main(){int i,j=0;
char a[]=\\(D)
A. Howareyou
B. Hay!
C. Howareyou!
D. ay
解析:主函数中利用for循环访问字符串a的每一个字符,判断当前字符是否为空格,如果是空格则保存该空格后面的一个字符存放到字符数组b中。在字符串”How are you!”中,第一个空格后面字符为’a’,第二个空格后面字符为’y’。
8.若有以下程序#include
char*a=\\(D)
A. #you#to#China!
B. me#you#to#China!
C. #China!
D. #to#China!
解析:程序中循环部分的主要功能是,在字符串b中寻找是否含有子串a,如果含有则退出,字符指针p指向该匹配子串后面的位置,利用printf函数输出则从该位置开始一直输出到字符串b的结尾。
9.以下能正确定义二维数组是
B
解析:C语言中定义二维数组,必须指定二维数组每一维的大小。选项A没有指定数组a行的大小,错误:选项B,虽然没有指定行大小,但是可以通过大括号里面的元素个数计算出行的大小为1,因此是正确的:选项C同样没有指定行的大小,也不能通过元素个数计算行的个数,错误:选项D定义的是二行三列数组,但是后面数据是三行,超出范围,所以错。
10.若有以下说明和语句
int c[4][5],(*p)[5];
能够正确引用c数组元素的是(D)
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];,则以下语句中正确的是(B)
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个元素是(B)
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];,则以下语句中正确的是(C)
A. p=a;
B. p[0]=a;
C. p[0]=a[1][2];
D. p[1]=a;
解析:本题考查多维
本文档预览:3600字符,共9147字符,源文件无水印,下载后包含无答案版和有答案版,查看完整word版点下载