当前位置:首页 > 《C%2B%2B数组与指针习题》
数组与指针习题 1
数组与指针习题
一、.基本概念与基础知识自测题
1 填充题
1.1 数组定义时有三个要素:数组名,数组元素的 (1) 和数组元素的 (2) 。按元素
在数组中的位置进行访问,是通过 (3) 进行的,称为 (4) 或 (5) 访问。为了使数组声明中数组的大小修改更为方便,总是将 (6) 用于声明数组长度。 答案:(1)类型
(2)数量
(3)下标运算符 (4)下标 (5)索引 (6)常变量
1.2 C/C++中的多维数组用的是一个 (1) 的定义,即多维数组的基本定义是 (2) 构成的数组,三维数组的元素是 (3) 。 答案:(1)嵌套
(2)以数组作为元素 (3)二维数组
1.3 计算机内存是一维编址的,多维数组在内存中的存储 (1) ,C/C++多维在内存中的
排列是 (2) 方式,即越 (3) 的下标变化 (4) 。设数组a有m行n列,每个元素占内存u个字节,则a[i][j]的首地址为 (5) + (6) 。 答案:(1)必须要转化为一维方式,
(2)按行方式 (3)右 (4)越快 (5)i*n*u (6)j*u
1.4 对于多维数组, (1) 的大小是确定的,所谓“不检查数组边界”只是不检查 (2)
的边界,而 (3) 的边界是在控制之中的,所以多维数组名作为函数的参数只可以 (4) 缺省。 答案:(1)较低各维的
(2)最高维(第一维) (3)较低各维 (4)最高维
1.5 指针变量包含另一变量的 (1)值,不可以任意给指针变量赋一个地址值,只能赋给它 (2) 和 (3) 的地址。使用变量名来访问变量,是按 (4) 来直接存取变量称为 (5) 方式;而借助指针变量取得另一变量的地址,访问该变量称为 (6) 方式。 答案:(1)地址
(2)NULL
(3)已经分配了内存的变量的地址 (4)按变量的地址 (5)直接访问
数组与指针习题 2
(6)间接访问
1.6 固定指向一个对象的指针,称为 (1) ,即 (2) ,定义时const放在 (3) 。而指向“常量”的指针称为 (4) ,指针本身可以指向别的对象,但 (5) ,定义时const放在 (6) 。 答案:(1)指针常量
(2)指针本身是常量
(3)const放在类型说明之后,变量名之前 (4)常量指针
(5)不能通过该指针修改对象 (6)const放在类型说明之前
1.7 数组名在表达式中被自动转换为 (1) 指针常量,数组名是地址,但数组名中放的地址是 (2) ,所以数组名 (3) 。这样数组名可以由 (4) 来代替,C++这样做使用时十分方便,但丢失了数组的另一要素 (5) ,数组名是指向 (6) 的指针,而不是指向 (7)的。编译器按数组定义的大小分配内存,但运行时 (8) ,这会带来无法预知的严重错误。 答案:(1)数组第一个元素的
(2)不可改变的 (3)称指针常量 (4)指针
(5)数组元素的数量 (6)数组元素 (7)数组整体
(8)对数组的边界不加检测 1.8 有一个三维数组:
int z3d[2][3][4];
给出指向三维数组第i行第j列第k页元素的指针的三种表达方式 (1) , (2) , (3) 。再给出这些元素的三种表达方式 (4) , (5) , (6) 。 答案:(1)z3d[i][j]+k或&z3d[i][j][k]
(2)*(z3d[i]+j)+k (3)*(*(z3d+i)+j)+k
(4)z3d[i][j][k]或*(z3d[i][j]+k) (5)*(*(z3d[i]+j)+k) (6)*(*(*(z3d+i)+j)+k)
二、编程与综合练习题
5.3 打印杨辉三角形(10行)。使用二维数组并利用每个系数等于其肩上两系数之和。 #include
int a[10][11]={0,1},i,j;//初始化时写好第1行,其余各行全0
for(i=1;i<10;i++)//为了全部算法无特例,共用11列,第1列全0,方便计算 for(j=1;j<=i+1;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i<10;i++){
for(j=1;j<=i+1;j++) cout< 数组与指针习题 3 5.4 将[例5.5]改用一维数组,附加行、列参数,实现通用算法。 解:用一维数组,附加行、列参数,实现通用算法难度大。 #include void multi(int [], int [], int [],int,int,int); void output(int [],int,int); void main(){ int middle[6*3], result[6*4];//注意写作6*3等可清楚看出矩阵的行列 int matrix1[3*6]={8,10,12,23,1,3,5,7,9,2,4,6,34,45,56,2,4,6}; int matrix2[3*4]={3,2,1,0,-1,-2,9,8,7,6,5,4}; output(matrix1,3,6); inverse(matrix1,middle,3,6); output(middle,6,3); output(matrix2,3,4); multi(middle,matrix2,result,6,3,4); output(result,6,4); return; } void inverse(int matrix1_1[],int middle_1[],int a,int b){ int i,j; for (i=0;i middle_1[i+j*a]=matrix1_1[i*b+j]; return; } void multi(int middle_1[],int matrix2_1[],int result_1[],int a,int b,int c){ int i,j,k; for (i=0;i result_1[i*c+j]+=middle_1[i*b+k]*matrix2_1[k*c+j]; } } return; } void output(int max_1[],int a,int b){ for (int i=0;i cout < 数组与指针习题 4 } cout< 5.5 编写函数int atoi(char s[ ]),将字符串s转化为整型数返回。注意负数处理方法。 #include while(*tp!='-'&&(*tp<'0'||*tp>'9')) tp++;//去除串前部无效字符 if(*tp=='-'){//读负号 f=-1; tp++; } if(*tp<'0'||*tp>'9') cout<<\串非法时,输出提示,返回0 while(*tp>='0'&&*tp<='9'){//转换数字串 temp=temp*10+*tp-48; tp++; } return f*temp; } void main(){ char num[20]; cin.getline(num,19); cout< 5.6 有如下定义: int ival=60021; int *ip; double *dp; 下面哪些赋值非法或可能带来错误,并加以讨论。 ival=*ip; ival=ip; *ip=ival; ip=ival; *ip=&ival; ip=&ival; dp=ip; dp=*ip; *dp=*ip; 解:ival=*ip; 错,未确定指针ip初值,用随机内存地址中的数据给ival赋值是危险的。但 语法对。 ival=ip; 错,赋值类型错,指针型不能赋给整型。 *ip=ival; 错,未确定指针ip初值,用ival给随机内存赋值是危险的。但语法对。 ip=ival; 错,赋值类型错,整型不能赋给指针型。 *ip=&ival; 错,赋值类型错,地址(指针型)不能赋给整型。 ip=&ival; 对,地址赋给指针型。 dp=ip; 错,整型指针不能赋给双精度指针。
共分享92篇相关文档