题号 |
题目 |
答案 |
解析 |
1 |
以下程序的输出结果是______。 main() { int i,x[3][3]={9,8,7,6,5,4,3,2,1},*p=&x[1][1]; for(i=0;i<4;i+=2) printf("%d",p[i]); } |
A、52
B、51
C、53
D、97 |
本题的考查点是通过指针引用数组元素。 i=0时,输出p[0],也就是x[1][1],输出是5; i=2时,输出p[2],即p[2+0],也就是x[2][0],输出是3。 故本题答案为C。
|
1 |
若有以下说明和语句,请选出哪个是对c数组元素的正确引用______。 int c[4][5],(*cp)[5]; cp=c; |
A. cp+1 B. *(cp+3) C. *(cp+1)+3 *(*cp+2) |
本题的考查点是数组元素的引用。 cp=c这个语句是将数组c的首行元素地址赋给了指针数组cp。 选项A,cp+1是指将数组c的首行地址加1,即为第二行地址; 选项B,*(cp+3)是地址,等于数组c的首地址加3的那个内存单元的内容,不是对数组元素的引用; 选项C,*(cp+1)+3是地址,等于数组c的首地址加1的那个内存单元中存放的值加3,不是对数组元素的引用。 故本题答案为D。 |
3 |
有以下程序 main() { char *p[10]={"abc","aabdfg","dcdbe","abbd","cd"}; printf("%d\n",strlen(p[4])); } 执行后的结果是______。 |
A 2 B 3 C 4 D 5
|
char *p[10]定义指针数组p,它由10个指向字符型数据的指针元素组成。并对前5个数组元素进行了初始化。 p[4]="cd",strlen(str)是统计字符串str中字符的个数(不包括终止符'\0'),即"cd"的长度。 故本题答案为A。 |
3 |
有以下程序 main() { char *p[10]={"abc","aabdfg","dcdbe","abbd","cd"}; printf("%d\n",strlen(p[4])); } 执行后的结果是______。
|
A、2
B、3
C、4
D、5
|
char *p[10]定义指针数组p,它由10个指向字符型数据的指针元素组成。并对前5个数组元素进行了初始化。 p[4]="cd",strlen(str)是统计字符串str中字符的个数(不包括终止符'\0'),即"cd"的长度。 故本题答案为A。 |
3 |
有以下程序: #include <string.h> main(int argc,char *argv[]) { int i,len=0; for(i=1;i<argc;i+=2) len+=strlen(argv[i]); printf("%d\n",len); } 经编译连接后生成的可执行文件是ex.exe,若运行时输入以下带参数的命令行ex abcd efg h3 k44 执行后输出结果是______。
|
A、14
B、12
C、8
D、6
|
本题的考查点是指针数组作main函数的形参。 C语言规定,main()函数可以带有两个参数,第一个参数为一个整型变量,它表示执行文件在执行时带的参数的个数,第二个参数为一个字符型指针数组,其中第一个数组元素指向程序名,第二个数组元素指向命令行中的第1个参数,以后依此类推。 结合本题,不难看出本题是求第1,3个参数的长度之和。即4+2=6。 故本题答案为D。 |
3 |
下面rotate函数的功能是:将n行n列的矩阵A转置为A',例如: |1 2 3 4 | |5 6 7 8 | 当A=|9 10 11 12| |13 14 15 16| |1 5 9 13| |2 6 10 14| 则A'=|3 7 11 15| |4 8 12 16| 请填空。 #define N 4 void rotate(int a[][]) { int i,j,t; for(i=0;i<N;i++) for(j=0;______;j++) {t=a[i][j]; ______; a[j][i]=t; } }
|
j<=i 或 i>=j 与 a[i][j]=a[j][i] |
将矩阵转置就是将行列数互换,即第二行第三列的数与第三行第二列的数进行互换。所以第一个空应当填入j<=i,第二空填入a[i][j]=a[j][i]。 |
3 |
以下不能正确定义二维数组的选项是______。
|
|
本题的考查点是二维数组的定义和初始化。 选项A定义的数组中各元素实际上是这样的: 1,0 2,0 选项B定义的数组中各元素实际上是这样的: 1,2 3,4 选项C定义的数组中各元素实际上是这样的: 1,0 2,3 选项D错在:C中在对数组进行初始化时,如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。 故本题答案为D。
|
3 |
以下程序运行后的输出结果是______。 (注:如果结果中含有回车,可加一空格写在一行,例如: 1 1 1 1 1 1 1 1 1可以写成1 1 1 1 1 1 1 1 1) main() { int i,j,a[][3]={1,2,3,4,5,6,7,8,9}; for(i=0;i<3;i++) for(j=i+1;j<3;j++) a[j][i]=0; for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%d ",a[i][j]); printf("\n"); } }
|
1 2 3 0 5 6 0 0 9
|
本题的考查点是C程序设计。根据程序写出运行结果。 程序开头定义了一个三行三列的数组。即: 1,2,3 4,5,6 7,8,9 进入循环,for(i=0;i<3;i++) for(j=i+1;j<3;j++) a[j][i]=0; 是把a[1][0],a[2][0],a[2][1]三个位置上的元素值赋为0,注意输出函数中%d后有空格。所以根据输出条件,程序最后的运行结果为: 1 2 3 0 5 6 0 0 9
|
5 |
有以下程序 main() { int a[3][3],*p,i; p=&a[0][0]; for(i=0;i<9;i++) p[i]=i; for(i=0;i<3;i++) printf("%d",a[1][i]); } 程序运行后的输出结果是______。
|
A、012
B、123
C、234
D、345
|
本题考查的是指针变量对数组的引用。 本题通过"for(i=0;i<9;i++)p[i]=i;"对二维数组a的元素依次赋值。赋值后,a的数组元素的值分别为a[0][0]=0, a[0][1]=1, a[0][2]=2, a[1][0]=3, a[1][1]=4, a[1][2]=5, a[2][0]=6, a[2][1]=7, a[2][2]=8, 故本题输出的值为345。 故本题答案为D。
|
22 |
以下能正确定义数组并正确赋初值的语句是______。
|
A、int N=5,b[N][N];
B、int a[1][2]={{1},{3}};
C、int c[2][]={{1,2},{3,4}};
D、int d[3][2]={{1,2},{3,4}};
|
本题的考查点是二维数组的初始化。 可以用下面方法对二维数组初始化: 1、分行给二维数组赋初值。如 static int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};这种赋初值方法比较直观,把第一个花括弧内的数据赋给第一行的元素,第二个花括弧内的数据赋给第二行的元素,……,即按行赋初值。 2、可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。 3、可以对部分元素赋初值。 static int a[3][4]={{1},{5},{9}}; 它的作用是只对各行第1列的元素赋初值,其余元素自动为0。 也可以对各行中的某一元素赋初值:static int a[3][4]={{1},{0,6},{0,0,11}}; 也可以只对某几行元素赋初值:static int a[3][4]={{1},{5,6}}; 4、如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。 选项A定义了数组但是没有赋值; 选项B定义的是一行两列,赋值却是两行一列; 选项C在二维数组定义中,行可以不指定,但是列是要指定的。 故本题答案为D。
|
22 |
有以下程序 main() {int a[][3]={{1,2,3},{4,5,0}},(*pa)[3],i; pa=a; for(i=0;i<3;i++) if(i<2) pa[1][i]=pa[1][i]-1; else pa[1][i]=1; printf("%d\n",a[0][1]+a[1][1]+a[1][2]); } 执行后输出结果是______。
|
A、7
B、6
C、8
D、无确定值
|
本题的考查点是二维数组和指针数组的应用。 在所给的程序中,pa指向二维数组首地址a,接着执行下面的for循环,当i=0或i=1时,数组元素 pa[1][i]的值减1,当 i=2时,数组元素pa[1][i]的值为1,此时得到新的二维数组a[][3]={{1,2,3},{3,4,1}},最终打印结果就是2+4+1=7。 故本题答案为A。
|
22 |
有以下程序 main() { int m[][3]={1,4,7,2,5,8,3,6,9}; int i,j,k=2; for(i=0;i<3;i++) {printf("%d ",m[k][i]);} } 执行后输出结果是______。
|
A、4 5 6
B、2 5 8
C、3 6 9
D、7 8 9 |
本题的考查点是二维数组的应用。 m[][3]即为定义的一个3行3列的二维数组,因为k=2,所以输出的为第二行的数组元素,即m[2][0],m[2][1],m[2][2],即3 6 9。 故本题答案为C。
|
4 |
以下能正确定义二维数组的是______。
|
A、int a[][3];
B、int a[][3]={2*3};
C、int a[][3]={};
D、int a[2][3]={{1},{2},{3,4}} |
本题考查的是二维数组的定义。 选项B不符合二维数组的定义规范,选项C中不能赋空值,选项D中a[2][3]表示a是一个2行3列的数组,而后面赋值却赋了3行,所以B,C,D均错误。 故本题答案为A。
|
4 |
若有以下说明和语句 int c[4][5],(*p)[5]; p=c; 能够正确引用c数组元素的是______。
|
A、p+1
B、*(p+3)
C、*(p+1)+3
D、*(p[0]+2)
|
本题考查的是数组元素的引用。 如果定义一个指针指向二维数组的一行,则可以移动到下一行,这就是行指针。行指针的定义格式为:[存储类型] 数据类型(*指针)[n] 这里的n是一个整数,表示所指向的二维数组的列数。(*p)[5]中p是指向一个包含5个元素的一维数组,p的值就是该一维数组的首地址。所以当用行指针访问二维数组时,行指针每增加1,就移动一行,即指向二维数组的下一行,例如此题中的p+i将指向数组的第i行。即选项A所指的意思是指向数组c的第1行,并不是引用c数组的元素;B答案中p+3是指向数组元素的第3行,*(p+3)是指第三行第零个元素的地址;选项C由对选项A,选项B的解释可知,它指的是第一行第3列元素的地址;选项D中p[0]+2是指第0行第2列元素的地址,再加个*就表示第0行第2列的元素,即c[0][2]。 故本题答案为D。
|
7 |
有以下程序 main() { int i,t[][3]={9,8,7,6,5,4,3,2,1}; for(i=0;i<3;i++) printf("%d ",t[2-i][i]); } 程序执行后的输出结果是______。
|
7 5 3 3 5 7 3 6 9 7 5 1 |
本题考查的是二维数组的应用。 将初始值放在一对大括号内,按数组元素排列的顺序对各元素赋值,二维数组中行下标可以省略,但列下标必须要指定,由此题可以看出数组t是一个三行三列的二维数组,执行for循环语句t[2-i][i]分别为t[2][0],t[1][1],t[0][2],得出输出结果为3 5 7。 故本题答案为B。 |
7 |
有以下程序 main() { char *p[]={"3697","2548"}; int i,j; long num=0; for(i=0;i<2;i++) { j=0; while(p[i][j]!= '\0') { if((p[i][j]- '0')%2) num=10*num+p[i][j]- '0'; j+=2; } } printf("%d\n",num); } 程序执行后的输出结果上______。
|
35 37 39 3975 |
本题考查的是指针数组。 题目中定义的指针数组"*p[]"相当于一个两行四列的数组。执行for()语句i=0,j=0,p[i][j]=p[0][0]=3,满足while循环条件,执行循环体中的if语句得num=3,j=2,此时p[i][j]=p[0][2]=9,满足循环条件,执行while循环体得num=39,j=4,判断while条件且不符合并退出while循环;再次执行for()语句i=1,j=0,p[i][j]=p[1][0]=2,满足while条件,执行循环体中的if语句,但不符合if条件,所以num不进行运算, j进行加2运算j=2,此时p[i][j]=p[1][2]=4,if条件还是为假,num不进行运算,j进行加2运算j=4,再执行while语句,条件不符合退出循环。所以结果为39。 故本题答案为C。
|
7 |
以下程序的输出结果是______。 main() { int a[3][3]={{1,2,9},{3,4,8},{5,6,7}},i,s=0; for(i=0;i<3;i++) s+=a[i][i]+ a[i][3-i-1]; printf("%d\n",s); }
|
30 |
本题考查的是多维数组以及for()循环语句的应用。 当i=0时,s=0+a[0][0]+ a[0][2]=10,i=1时, s=10+a[1][1] +a[1][1]=18,i=2时,s=18 +a[2][2] +a[2][0]=30。
|
10 |
若有定义语句:int a[3][6];,按在内存中的存放顺序,a数组的第10个元素是______。
|
A、a[0][4]
B、a[1][3]
C、a[0][3]
D、a[1][4]
|
本题的考查点是二维数组的排列方式。 在一维存储器中存放二维数组,有两种方式:一种是按行排列, 即放完一行之后顺次放入第二行。另一种是按列排列, 即放完一列之后再顺次放入第二列。在C语言中,二维数组是按行排列的。本题数组"a[3][6]"表示a数组存放了三行六列,第一行从a[0][0]到a[0][5],第二行从a[1][0]到a[1][5],第三行从a[2][0]到a[2][5],所以a数组的第10个元素是a[1][3]。 故本题答案为B。 |
10 |
若有定义语句:int a[2][3],*p[3];,则以下语句正确的是______。
|
A、p=a;
B、p[0]=a;
C、p[0]=&a[1][2];
D、p[1]=&a;
|
本题考查的数组及指针的定义。 本题定义了一个二维数组a和一个指针数组p。选项A中变量p是一个数组,它是一个地址常量,不能放在等号的左边,所以选项A错误;选项B中,a是一个指向int[]的地址常量,p[0]是一个int型地址,所以不能将a赋值给p[0],故选项B错误;选项D中将一个二维数组地址赋值给一个整型指针,是非法的。 故本题答案为C。 |
11 |
若有定义:int a[2][3];,以下选项中对a数组元素正确引用的是______。
|
A:a[2][!1] B:a[2][3] C:a[0][3] D:a[1>2][!1] |
本题的考查点是数组元素的引用。 本题定义了一个2行3列的整型二维数组,即a[0][0]到a[1][2],所以选项A、B、C的引用均超出了范围,错误;C语言中,数组下标可以是表达式,所以选项D的形式正确,且选项D的表达式也在引用范围内,即a[0][0],故选项D正确。 故本题答案为D。
|
13 |
有以下程序 #include <stdio.h> #define N 4 void fun(int a[][N],int b[]) { int i; for(i=0;i<N;i++) b[i]=a[i][i]; } main() { int x[][N]={{1,2,3},{4},{5,6,7,8},{9,10}},y[N],i; fun(x,y); for(i=0;i<N;i++) printf("%d,",y[i]); printf("\n"); } 程序的运行结果是______。 A:1,2,3,4 B:1,0,7,0 C:1,4,5,9 D:3,4,8,10
|
B |
本题的考查点是二维数组的应用。 在主函数中,定义并初始化了4行4列的二维数组x。对于二维数组元素的赋值,可以只对部分元素赋初值,未赋初值的元素自动取0。x数组元素赋初值后各元素为:
fun函数的作用是将二维数组a中主对角线元素赋给数组b,由于数组a与数组x共用同一存储单元,也即将数组x中主对角线元素赋给了数组b。又因为数组b与数组y共用同一存储单元,所以主函数中通过语句"printf("%d,",y[i]);"输出的即为数组b中的值,所以程序运行结果为"1,0,7,0,"。 故本题答案为B。
|
15 |
若有定义语句:int a[4][10],*p,*q[4];且0≤i<4,则错误的赋值是______。
|
A p=a B q[i]=a[i] C p=a[i] D p=&a[2][1] |
本题主要考查了二维数组的引用。 本题a表示二维数组的首地址,其基类型为具有4个整型元素的指针,而p的基类型为一个整型指针,所以其基类型不同,不能相互赋值。 故本题答案为A。
|
17 |
有如下程序 main() { char ch[2][5] = {"6937","8254"},*p[2]; int i,j,s = 0; for(i = 0; i < 2; i++) p[i] = ch[i]; for(i = 0; i < 2; i++) for(j = 0; p[i][j] > '\0'; j += 2) s = 10*s + p[i][j] - '0';
printf("%d\n",s); } 该程序的输出结果是______。
|
A、69825
B、63825
C、6385
D、693825
|
本题主要考查点是二维数组的应用。 本题"ch[2][5] = {"6937","8254"}"用于2行5列的二维数组初始化,ch[0][0]到ch[0][4]的值分别为:6,9,3,7,\0;ch[1][0]到ch[1][4]的值分别为:8,2,5,4,\0;第一个for循环用于将数组指针分别指向二维数组的第一行和第二行;第二个for嵌套循环用于取出p[0][0], p[0][2], p[1][0], p[1][2]四个存储单元的元数组成一个四位数进行输出。具体执行过程如下: i=0: j=0:s=0+(p[0][0]-'0');即s=6("p[0][0]-'0'"通过ASCII码相减的方法将字符转换成数字) j=2:s=60+(p[0][2]-'0');即s=63; i=1: j=0:s=630+(p[1][0]-'0');即s=638 j=2:s=6380+(p[1][2]-'0')'即s=6385; 故本题答案为C。 |
17 |
若有以下定义:int t[3][2]; 能正确表示t数组元素地址的表达式是______。
|
A、&t[3][2] B、t[3] C、t[1] D、*t[2] |
A和B两个表达式都已越界了;*t[2]是目标变量,即一个整数,而不是地址值。 本题答案为C |
18 |
以下程序的输出结果是______。 main() { char w[][10]={"ABCD","EFGH","IJKL","MNOP"},k; for(k=1;k<3;k++) printf("%s\n",w[k]); }
|
A、ABCD FGH KL B、ABCD EFG IJ M C、EFG JK O D、EFGH IJKL |
本题中定义的二维数组w,相当于四个一维字符串数组,这四个一维数组的头指针分别为w[0]、w[1]、w[2]、w[3]。for循环输出时,输出的是以w[1]、w[2]为首地址的字符串,即EFGH、IJKL。 本题答案为D。
|
18 |
以下程序的输出结果是______。 main() { int a[3][3]={{1,2},{3,4},{5,6}},i,j,s=0; for (i=1;i<3;i++) for(j=0;j<=i;j++)s+=a[i][j]; printf("%d\n",s); }
|
A、18
B、19
C、20
D、21
|
本题外循环执行两次,分别是i=1,i=2,内循环,第一次j从0到1,s=0+a[1][0]+a[1][1]=7;第二次j从0到2,s=7+a[2][0]+a[2][1]+a[2][2]=18。 本题答案为A。
|
19 |
以下程序的输出结果是______。 main() { int a[4][4]={{1,3,5},{2,4,6},{3,5,7}}; printf("%d%d%d%d\n",a[0][3],a[1][2],a[2][1],a[3][0]); }
|
A、0650
B、1470
C、5430
D、输出值不定
|
本题考查C语言中的二维数组的初始化。对未给出初始值的整数数组元素,被缺省初始化为零。 本题答案为A。
|
|
|
|
|