您的位置:首页 > 其它

二维数组和二维指针

2016-01-01 15:54 316 查看

二维数组和二维指针

题号
题目
答案
解析
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

;

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是一个整数,表示所指向的二维数组的列数。(*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[]
,int b[])
{ int i;
for(i=0;i<N;i++) b[i]=a[i][i];
}
main()
{ int x[]
={{1,2,3},{4},{5,6,7,8},{9,10}},y
,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。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: