二维数组和二维指针

二维数组和二维指针

题号

题目

答案

解析

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

 

D345

 

 

   本题考查的是指针变量对数组的引用。

    本题通过"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}};

 

Dint  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

以下能正确定义二维数组的是______。

 

Aint 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]

 

Ba[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;

 

Cp[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]

Ct[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

DEFGH

   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。

 

 

 

 

 

 

你可能感兴趣的:(二维数组和二维指针)