当前位置:文档之家› 多维数组与指针习题

多维数组与指针习题


多维数组与指针练习题



***********************************************************************************

一、选择题

(1)有以下程序

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)0 1 2

B)1 2 3

C)2 3 4

D)3 4 5

(2)有以下程序

main()
{ int a[3][2]={0},(*ptr)[2],i,j;
for(i=0;i<2;i++)
{ ptr=a+i;
scanf("%d",ptr);
ptr++;
}
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
printf("%2d",a[i][j]);
printf("\n");
}
}


若运行时输入:1 2 3<回车>,则输出结果为

A)产生错误信息
B)1 0
2 0
0 0
C)1 2
3 0
0 0
D)1 0
2 0
3 0

(3)有以下程序

main()
{
int num[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}},i,j;
for(i=0;i<4;i++)
{
for(j=1;j<=i;j++) printf("%c",' ');
for(j= j<4;j++) printf("%4d",num[i][j]);
printf("\n");
}
}


若要按以下形式输出数组右上半三角

1 2 3 4

6 7 8

11 12

16

则在程序下划线处应填入的是

A) i-1

B) i

C) i+1

D) 4-i

(4) 以下能正确定义二维数组的是

A) int a[][3];

B) int a[][3]= {2*3};

C) int a[][3]={};

D) int a[2][3]={{1},{2},{3,4}};

(5) 若有以下说明和语句,int c[4][5],(*p)[5];p=c;能正确引用c数组元素的是

A) p+1

B) *(p+3)

C) *(p+1)+3

D) *(p[0]+2))

(6) 有以下定义和语句

int a[3][2]={1,2,3,4,5,6,},*p[3];

p[0]=a[1];

则*p[0]+1)所代表的数组元素是

A) a[0][1]

B) a[1][0]

C) a[1][1]

D) a[1][2]

(7) 有以下程序

int f(int b[][4])
{ int i,j,s=0;
for(j=0;j<4;j++)
{ i=j;
if(i>2) i=3-j;
s+=b[i][j];
}
return s;
}
main( )
{ int a[4][4]={{1,2,3,4},{0,2,4,5},{3,6,9,12},{3,2,1,0}};
printf(“%d\n”,f(A) );
}


执行后的输出结果是

A) 12

B) 11

C) 18

D) 16

(8) 以下不能正确定义二维数组的选项是

A) int a[2][2]={{1},{2}};

B) int a[][2]={1,2,3,4};

C) int a[2][2]={{1},2,3};

D) int a[2][]={{1,2},{3,4}};

(9) 若有定义:int *p[3];, 则以下叙述中正确的是

A) 定义了一个基类型为int的指针变量p,该变量具有三个指针

B) 定义了一个指针数组p,该数组含有三个元素,每个元

素都是基类型为int的指针

C) 定义了一个名为*p的整型数组,该数组含有三个int类型元素

D) 定义了一个可指向一维数组的指针变量p,所指一维数组应具有三个int类型元素

(10) 有以下程序

main()
{ int a[3][3], *p, i;
p=&a [0][0] ;
for ( i=0 ; i<9 ; i++) p[i]=i+1;
printf("%d\n",a[1][2]);
}


程序运行后的输出结果是

A) 3

B) 6

C) 9

D) 2

 (11) 以下能正确定义数组并正确赋初值的语句是

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},{34}};

(12) 有以下程序

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

(13) 有以下程序

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) 无确定值

(14) 有以下程序

main()
{ int aa[4][4]={{1,2,3,4},{5,6,7,8},{3,9,10,2},{4,2,9,6}};
int i,s=0
for(i=0;i<4;i++) s+=aa[i][1];
printf(“%d\n”,s);
}


程序运行后的输出结果是

A) 11

B) 19

C) 13

D) 20

(15) 若有以下定义和语句:

int s[4][5],(*ps)[5];

ps=s;

则对s数组元素的正确引用形式是

A) ps+1

B) *(ps+3)

C) ps[0][2]

D) *(ps+1)+3

 (16) 以下程序的输出结果是

main()
{ int b[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=1;
for(i=0;i<3;i++)
for(j=i;j<=i;j++) t=t+b[i][b[j][j]];
printf("%d\n",t);
}


A) 3

B) 4

C) 1

D) 9

(17) 以下数组定义中不正确的是

A) int a[2][3];

B) int b[][3]={0,1,2,3};

C) int c[100][100]={0};

D) int d[3][]={{1,2},{1,2,3},{1,2,3,4}};

(18) 以下程序的输出结果是

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) 输出值不定

(19) 以下程序的输出结果是

A) 1,5,9

B) 1,4,7

C) 3,5,7

D)3,6,9

main()
{ int i, x[3][3]={1,2,3,4,5,6,7,8,9};
for(i=0;i<3;i++) printf(“%d,”,x[i][2-i]);
}


(20) 以下程序的输出结果是

A) 18

B) 19

C) 20

D)21

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(“%dn”,s);
}

(21) 若有以下的定义:int t[3][2];能正确表示t数组元素地址的表达式是

A) &t[3][2]

B) t[3]

C) t[1]

D) t[2]

(22) 有如下程序

main0
{ int a[3][3]={{1,2},{3,4},{5,6}},i,j,s=0;
for(i=1;i<3;i++)
for(j=0;j
printf(“%d\n”,s);
}


该程序的输出结果是

A) 18

B) 19

C) 20

D) 21

(23) 下列程序执行后的输出结果是

A) 3

B) 6

C) 9

D) 随机数

main()
{ int a[3][3], *p,i;
p=&a[0][0];
for(i=p; i<9; i++) p[i]=i+1;
printf("%d \n",a[1][2]);
}


(24) 以下程序的输出结果是

A) 5 2

B) 5 1

C) 5 3

D) 9 7

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]);
}

(25) 若有以下的说明和语句,则在执行for语句后,*(*(pt+l)+2)表示的数组元素是

A) t[2][0] B) t[2][2] C) t[l][2] D) t[2][l]

int t[3][3], *pt([3], k;

for (k=0;k<3;k++) pt[k]=&t[k][0];



 (26) 以下程序的输出结果是

A)14

B)0

C)6

D)值不确定

main()
{ int n[3][3] , i, j;
for ( i=0; i<3; i++ )
for ( j=0; j<3; j++ ) n[i][j]=i+j;
for ( i=0; i<2; i++ )
for ( j=0; j<2; j++ ) n[i+1][j+1]+= n[i][j];
printf(“%d\n”,n[i][j]);
}


(27) 执行以下程序段后,m的值为

int a[2][3]={ {1,2,3},{4,5,6} };
int m,*p;
p=&a[0][0];
m=(*p)*(*(p+2))*(*(p+4));


A) 15

B) 14

C) 13

D) 12

(28) 若有以下定义和语句:

int w[2][3],(*pw)[3];

pw=w;

则对w数组元素非法引用是

A)*(w[0]+2)

B)*(pw+1)[2]

C)pw[0][0]

D)*(pw[1]+2)

(29) 若有以下说明:

int w[3][4]o={{0,1},{2,4},{5,8}};

int(*p)[4]=w;

则数值为4的表达式是

A) *w[1]+1

B) p++,*(p+1)

C) w[2][2]

D) p[1][1]

(30) 若有以下的说明和语句:

main()
{int t[3][2], *pt[3],k;
fpr(k=o; k<3;k++)pt[k]=t[k];
}


则以一选项中能正确表示t数组元素地址的表达式是

A) &t[3][2]

B) *pt[0]

C) *(pt+1)

D) &pt[2]

(31) 定义如下变题和数组:

int i;
int x[3][3]={1,2,3,4,5,6,7,8,9};
则下面语句的输出结果是
for(i=0;i<3;i++) printf("%d",x[i][2-1]);


A) 1 5 9

B) 1 4 7

C) 3 5 7

D) 3 6 9

(32) 设有以下定义:


int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};

int (*prt)[3]=a,*p=a[0];

则下列能够正确表示数组元素a[1][2]的表达式是

A) *((*prt+1) [2])

B) *(*(p+5))

C) (*prt+1)+2

D) *(*(a+1)+2)

(33) 下面程序的输出是

A) 23

B) 26

C) 33

D) 36

int aa[3][3]={{2},{4},{6}};
main()
{ int i, * p=&aa[0][0];
for(i=0; i<2;i++)
{ if(i==0)
aa[i][i+1]=*p+1;
else
++p;
printf("%d",*p);}
}


(34) 下面程序的输出是

A) 60

B) 68

C) 99

D) 108

main()
{ int a[3][4]={ 1,3,5,7,9,11,13,15,17,19,21,23};
int ( *p)[4]=a,i,j,k=0;
for(i=0; i<3; i++)
for(j=0; j<2; j++)
k=k+*( *(p+i)+j);
printf("%d\n",k);}


(35) 若有以下说明和语句,请选出哪个是对c数组元素的正确引用

int c[4][5], (*cp)[5];

cp=c;

A) cp+1

B) *(cp+3)

C) *(cp+1)+3

D) *(*cp+2)

(36) 设有说明int(*ptr)[m];其中的标识符ptr是 【36】 。

A)M个指向整型变量的指针

B)指向M个整型变量的函数指针

C)一个指向具有M个整型元素的一维数组的指针

D)具有M个指针元素的一维指针数组,每个元素都只能指向整型量

 二、填空题:

(1)以下函数rotate的功能是:将a所指N行N列的二维数组中的最后一行放到b所指二维数组的第0列中,把a所指二维数组中的第0行放到b所指二维数组的最后一列中,b所指二维数组中其他数据不变。

# define N 4
void rotate(int a[][N], int b[][N])
{ int i, j;
for (i=0; i
{ b[i][N-1] = 【1】 ; 【2】 = a[N-1][i]; }
}


(2)以下程序中,fun函数的功能是求3行4列二维数组每行元素中的最大值.请填空.

void fun(int, int, int (*)[4],int *)
main()
{
int a[3][4]={{12,41,36,28},{19,33,15,27},{3,27,19,1}},b[3],i;
fun(3,4,a,b);
for(i=0;i<3;i++)
printf("%4d",b[i]);
printf("\n");
}
void fun(int m,int n,int ar[][4],int *br)
{
int i,j,x;
for(i=0;i
{ x=ar[i][0];
for(j=0;j
if(x
【3】 =x;
}


(3) 以下程序中,函数 sumColumM的功能是:求出M行N列二维数组每列元素中的最小值,并计算它们的和值。和值通过形参传回主函数输出。请填空。

#define M 2
#define N 4
void SumColumMin(int a[M][N],int *sum)
{ int i,j,k,s=0;
for(i=0;i
{ k=0;
for(j=1;j
if(a[k][i]>a[j][i])k=j;
s+= 【4】 ;
}
【5】 =s;
}
main()
{ int x[M][N]={3,2,5,1,4,1,8,3},s;
SumColumMin( 【6】 );

printf("%d\n",s);
}


(4) 下面rotate函数的功能是:将n行n列的矩阵A转置为A’,例如:

1 2 3 4 1 5 9 13

5 6 7 8 2 6 10 14

当 A= 9 10 11 12 则 A’=3 7 11 15

13 14 15 16 4 8 12 16

请填空

#define N 4
void rotate(int a[][N])
{ int i,j,t;
for(i=0;i
for(j=0;【7】;j++)
{ t=a[i][j];
【8】 ;
a[j][i]=t;
}
}


(5) 以下程序运行后的输出结果是 【9】

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");
}
}

(6) 若有以下程序

main()
{ int a[4][4]={{1,2,-3,-4},{0,-12,-13,14},{-21,23,0,-24},{-31,32,-33,0}};
int i,j,s=0;
for(i=0;i<4;i++)
{ for(j=0;j<4;j++)
{ if(a[i][j]<0)continue;
if(a[i][j]==0)break;
s+=a[i][j];
}
}
printf("%d\n",s);
}


执行后输出的结果是 【10】 。

(7) 函数YangHui的功能是把杨辉三角形的数据赋给二维数组的下半三角,形式如下

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

其构成规律是:

第0列元素和主对角线无素均为1

其余元素为其左上方和正上方元素之和

数据的个数每行递增1

请将程序补充完整。

#defint N 6
void YangHui(int *[N][N])
{ int i,j;
x[0][0]=1
for(i=1;i
{ x[i][0]= 【11】 =1;
for(j=1;j
x[i][j]= 【12】 ;
}
}


(8) fun函数的功能是:首先对a所指的N行N列的矩阵,找出各行中的最大的数,再求这N个最大值中的最小的那个数作为函数值返回。请填空。

#include
#define N 100
int fun(int(*a)[N])
{ int row,col,max,min;
for(row=0;row
{ for(max=a[row][0],col=1;col
if( [13] )max=a[row][col];
if( row==0)min=max;
else if( [14] )min=max;
}
return min;
}


(9) 以下程序中,select 函数的功能是:在N行M列的二维数组中,选出一个最大值作为函数值返回,并通过形参传回此最大值所在的行下标。请填空。

#define N 3
#define M 3
select(int a[N][M],int *n)
{ int i,j,row=1,colum=1;
for(i=0;i
for(j=0;j
if(a[i][j]>a[row][colum]){row=i;colum=j;}
*n= 【15】;
return 【16】;
}
main()
{int a[N][M]={9,11,23,6,1,15,9,17,20},max,n;
max=select(a,&n);
printf("max=%d,line=%d\n",max,n);
}


(10) 以下程序中,主函数调用了LineMax函数,实现在N行M列的二维数组中,找出

每一行上的最大值。请填空。

#define N 3
#define M 4
void LineMax(int x[N][M])
{ int i,j,p;
for(i=0; i
{ p=0;
for(j=1; j
if(x[i][p]
printf(“The max value in line %d is %d\n”, i, 【18】 );
}
}
main()
{ int x[N][M]={1,5,7,4,2,6,4,3,8,2,3,1};
【19】
}

 (11) 设在主函数中有以下定义和函数调用语句,且fun函数为void类型;请写出fun函数的首部[20] 。要求形参名为b。

main()
{ double s[10][22];
int n; ┆

fun(s);

}


(12) 设有以下定义的语句:

int a[3][2]={10,20,30,40,50,60}, (*p)[2];

p=a;

则 *(*(p+2)+1)值为【21】 。

(13) 阅读下列程序:

#include
main()
{ int i, j, row, column,m;
static int array[3][3]={{100,200,300},
{28,72,-30},
{-850,2,6}
};
m=array[0][0];
for (i=0; i<3; i++)
for (j=0; j<3; i++)
if (array[i][j]
{ m=array[i][j]; row=i; column=j;}
printf("%d,%d,%d\n",m,row,column);
}


上述程序的输出结果是 【22】 。






答案:

一、选择题:

01) D 02)B 03) B 04) B 05) D

06) C 07) D 08) D 09) B 10) B

11) D 12) C 13) A 14) B 15) C

16) B 17) D 18) A 19) C 20) A

21) D 22) A 23) B 24) C 25) C

26) C 27) A 28) B 29) D 30) C

31) C 32) D 33) A 34) A 35) D

36) C

二、填空题:

(1) A[0][i]

(2) b[i][0]

(3) br[i]

(4) a[k][i]

(5) *sum

(6) x,&s

(7) j<=i

(8) a[i][j]=a[j][i]

(9) 1 2 3 0 5 6 0 0 9

(10) 58

(11) x[i][i]

(12) x[i-1][j-1]+x[i-1][j] 或 [i-1][j]+x[i-1][j-1]

(13) a[row][col]>max 或 a[row][col]>=max 或 max<=a[row][col]

(14) Maxmax 或 max<=min 或 min>=max

(15) row

(16) a[row][colum]

(17) sp=j

(18) cx[i][p]

(19) LineMax(x)

(20) void fun(double b[][22])

或 void fun(double b[0][22])

或 void fun(double (*b)[22])

(21) 60

(22) -850,2,0若遗漏逗号扣1分



相关主题
文本预览
相关文档 最新文档