多维数组与指针习题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
多维数组与指针练习题
***********************************************************************************
一、选择题
(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分