内容正文:
编写说明:山东省春季高考《软件与应用技术类考纲百套卷》,依据山东省《软件与应用技术类专业知识考试标准》编写。每门课程均分三层训练:基础层(具象化支架)拆解考点为微目标,紧扣考纲 “掌握”“理解” 要求编写考点训练卷;巩固层(关联性支架)强化知识交叉与场景关联,按考纲专题编专题训练卷;应用层(引导性支架)聚焦真题突破,结合知识模块与教材编写课程综合卷。
本试卷是第14卷,按《C语言程序设计》范围和要求编写。具体内容为:
掌握指向数组的指针变量。
山东省《软件与应用技术类考纲百套卷》 第14卷
《C语言程序设计》
指向数组的指针变量 考点训练卷
考试时间60分钟 满分100分
班级 姓名 学号 成绩
一、选择题(本大题共20小题,每题3分,共60分)
1.以下关于 C 语言数组名的描述中,正确的是( )
A. 数组名是变量,可以被赋值
B. 数组名代表数组最后一个元素的地址
C. 数组名代表数组第一个元素的地址
D. 数组名的类型是 int 型
2.以下定义指向包含 5 个 int 元素的一维数组的指针变量,正确的是( )
A. int *p [5];
B. int (*p)[5];
C. int p [5];
D. int **p;
3.若有定义int a[5]={1,2,3,4,5}, *p=a;,则p+2指向的元素是( )
A. a [2]
B. a [3]
C. a [0]+2
D. a [1]+2
4.若有定义int a[5]={1,2,3,4,5}, *p=a;,则*(p+3)的值是( )
A. 1
B. 2
C. 3
D. 4
5.数组名作为函数参数时,传递的是( )
A. 数组全部元素的值
B. 数组首元素的地址
C. 数组的长度
D. 数组第一个元素的值
6.若有定义int a[5], *p=a;,以下表达式错误的是( )
A. p++
B. *(p+1)
C. a++
D. p [2]
7.若有定义int a[3][4], (*p)[4]=a;,则p+1指向的是( )
A. a [1]
B. a [0][1]
C. a [0]+1
D. a [1][0]
8.执行以下程序段后,输出结果是( )
int a[5]={1,2,3,4,5}, *p=a;
printf("%d", *p++);
A. 2
B. 3
C. 4
D. 1
9.若有定义int a[5]={1,2,3,4,5}, *p=a;,则p[2]等价于( )
A. p+2
B. *(p+2)
C. *a+2
D. a+2
10.以下关于指针算术运算的描述中,正确的是( )
A. 两个指针可以相加
B. 指针可以乘以一个整数
C. 指针可以减去一个整数
D. 指针可以除以一个整数
11.执行以下程序段后,输出结果是( )
int a[5]={1,2,3,4,5}, *p=&a[2];
printf("%d", p[1]);
A. 4
B. 3
C. 5
D. 2
12.若有定义int a[3][4]={{1,2},{3,4},{5,6}}, (*p)[4]=a;,则*(*(p+1)+1)的值是( )
A. 1
B. 2
C. 4
D. 3
13.以下函数定义中,形参为数组指针的是( )
A. void fun (int a [5])
B. void fun (int (*p)[5])
C. void fun (int *p)
D. void fun (int **p)
14.若有定义int a[5]={1,2,3,4,5}, *p=a+1;,则以下表达式值为 3 的是( )
A. *p+2
B. *(p+1)
C. p+2
D. *p++
15.执行以下程序段后,输出结果是( )
int a[5]={1,2,3,4,5}, *p=a;
while(*p!=3) p++;
printf("%d", *p);
A. 1
B. 2
C. 4
D. 3
16.以下关于指向二维数组的指针的描述中,正确的是( )
A. int (*p)[4] 可以指向任意二维数组
B. int (*p)[4] 只能指向列数为 4 的二维数组
C. int (*p)[4] 可以指向行数为 4 的二维数组
D. int (*p)[4] 是指针数组
17.若有定义int a[5]={5,4,3,2,1}, *p=a;,则*(p+4)的值是( )
A. 5
B. 4
C. 1
D. 2
18.执行以下程序段后,输出结果是( )
int a[5]={1,2,3,4,5}, *p=a, *q=&a[4];
printf("%d", q-p);
A. 4
B. 5
C. 20
D. 编译错误
19.以下用指针遍历数组的写法中,错误的是( )
A. for (p=a; p<a+5; p++) printf ("% d", *p);
B. for (p=a; *p!='\0'; p++) printf ("% d", *p);
C. for (i=0; i<5; i++) printf ("% d", *(a+i));
D. for (i=0; i<5; i++) printf ("% d", p [i]);
20.若有定义int a[3][4], (*p)[4]=a;,则p[2][3]等价于( )
A. a [2][3]
B. *(p+2)+3
C. *(*p+2)+3
D. *(p [2]+3)
二、简答题(本大题共2小题,每题10分,共20分)
1.阅读以下 C 语言程序,程序运行后的结果为______
#include <stdio.h>
int main()
{
int a[5]={2,4,6,8,10};
int *p=a, i;
for(i=0; i<5; i++)
{
printf("%d ", *(p+i)*2);
}
printf("
");
return 0;
}
2.阅读以下 C 语言程序,程序运行后的结果为______
#include <stdio.h>
int main()
{
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int (*p)[3]=a, i;
for(i=0; i<3; i++)
{
printf("%d ", *(*p+i));
}
return 0;
}
三、案例分析题(本大题共1小题,每题10分,共10分)
1.以下程序的功能是:用指针实现数组元素的逆序存放。请在程序的下划线处填入正确的内容,使程序完整并能正确运行。
#include <stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
int *p=a, *q=&a[4], temp;
while(____1____)
{
temp=*p;
____2____;
____3____;
p++;
____4____;
}
for(int i=0; i<5; i++)
printf("%d ", a[i]);
return 0;
}
四、综合应用题(本大题共1小题,每题10分,共10分)
1.编写一个 C 语言程序,实现以下功能:定义一个包含 10 个元素的整型数组,要求输入 10 个整数存入数组,用指针遍历数组,计算数组所有元素的平均值并输出(保留两位小数)。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
编写说明:山东省春季高考《软件与应用技术类考纲百套卷》,依据山东省《软件与应用技术类专业知识考试标准》编写。每门课程均分三层训练:基础层(具象化支架)拆解考点为微目标,紧扣考纲 “掌握”“理解” 要求编写考点训练卷;巩固层(关联性支架)强化知识交叉与场景关联,按考纲专题编专题训练卷;应用层(引导性支架)聚焦真题突破,结合知识模块与教材编写课程综合卷。
本试卷是第14卷,按《C语言程序设计》范围和要求编写。具体内容为:
掌握指向数组的指针变量。
山东省《软件与应用技术类考纲百套卷》 第14卷
《C语言程序设计》
指向数组的指针变量 考点训练卷
考试时间60分钟 满分100分
班级 姓名 学号 成绩
一、选择题(本大题共20小题,每题3分,共60分)
1.以下关于 C 语言数组名的描述中,正确的是( )
A. 数组名是变量,可以被赋值
B. 数组名代表数组最后一个元素的地址
C. 数组名代表数组第一个元素的地址
D. 数组名的类型是 int 型
【答案】C
【解析】数组名是常量指针,代表数组首元素的地址,不能被赋值。
2.以下定义指向包含 5 个 int 元素的一维数组的指针变量,正确的是( )
A. int *p [5];
B. int (*p)[5];
C. int p [5];
D. int **p;
【答案】B
【解析】int (*p)[5]是数组指针,指向包含 5 个 int 元素的一维数组;A 是指针数组,每个元素是 int 指针。
3.若有定义int a[5]={1,2,3,4,5}, *p=a;,则p+2指向的元素是( )
A. a [2]
B. a [3]
C. a [0]+2
D. a [1]+2
【答案】A
【解析】指针 p 指向 a [0],p+1 指向 a [1],p+2 指向 a [2],指针加减按元素大小偏移。
4.若有定义int a[5]={1,2,3,4,5}, *p=a;,则*(p+3)的值是( )
A. 1
B. 2
C. 3
D. 4
【答案】D
【解析】*(p+3)等价于 a [3],值为 4。
5.数组名作为函数参数时,传递的是( )
A. 数组全部元素的值
B. 数组首元素的地址
C. 数组的长度
D. 数组第一个元素的值
【答案】B
【解析】数组名作为函数参数时退化为指针,传递首元素地址。
6.若有定义int a[5], *p=a;,以下表达式错误的是( )
A. p++
B. *(p+1)
C. a++
D. p [2]
【答案】C
【解析】数组名是常量指针,不能进行自增运算;p 是变量指针,可以自增。
7.若有定义int a[3][4], (*p)[4]=a;,则p+1指向的是( )
A. a [1]
B. a [0][1]
C. a [0]+1
D. a [1][0]
【答案】A
【解析】p 是指向包含 4 个 int 元素的一维数组的指针,p+1 跳过 4 个 int 元素,指向 a [1](第二行)。
8.执行以下程序段后,输出结果是( )
int a[5]={1,2,3,4,5}, *p=a;
printf("%d", *p++);
A. 2
B. 3
C. 4
D. 1
【答案】D
【解析】*p++是后置自增,先取 * p 的值 1,然后 p 自增指向 a [1]。
9.若有定义int a[5]={1,2,3,4,5}, *p=a;,则p[2]等价于( )
A. p+2
B. *(p+2)
C. *a+2
D. a+2
【答案】B
【解析】指针下标访问p[i]等价于*(p+i),与数组下标访问规则一致。
10.以下关于指针算术运算的描述中,正确的是( )
A. 两个指针可以相加
B. 指针可以乘以一个整数
C. 指针可以减去一个整数
D. 指针可以除以一个整数
【答案】C
【解析】指针可以加减整数(按元素大小偏移),也可以减去同类型指针(得到元素个数差),不能进行乘除和相加运算。
11.执行以下程序段后,输出结果是( )
int a[5]={1,2,3,4,5}, *p=&a[2];
printf("%d", p[1]);
A. 4
B. 3
C. 5
D. 2
【答案】A
【解析】p 指向 a [2],p[1]等价于*(p+1),即 a [3],值为 4。
12.若有定义int a[3][4]={{1,2},{3,4},{5,6}}, (*p)[4]=a;,则*(*(p+1)+1)的值是( )
A. 1
B. 2
C. 4
D. 3
【答案】C
【解析】p+1 指向 a [1],*(p+1)是 a [1] 的首地址,*(p+1)+1指向 a [1][1],值为 4。
13.以下函数定义中,形参为数组指针的是( )
A. void fun (int a [5])
B. void fun (int (*p)[5])
C. void fun (int *p)
D. void fun (int **p)
【答案】B
【解析】int (*p)[5]是指向包含 5 个 int 元素的一维数组的指针;A 和 C 本质都是 int 指针。
14.若有定义int a[5]={1,2,3,4,5}, *p=a+1;,则以下表达式值为 3 的是( )
A. *p+2
B. *(p+1)
C. p+2
D. *p++
【答案】B
【解析】p 指向 a [1](值 2),*(p+1)是 a [2],值为 3。
15.执行以下程序段后,输出结果是( )
int a[5]={1,2,3,4,5}, *p=a;
while(*p!=3) p++;
printf("%d", *p);
A. 1
B. 2
C. 4
D. 3
【答案】D
【解析】指针 p 从 a [0] 开始遍历,直到指向值为 3 的元素 a [2],输出 * p=3。
16.以下关于指向二维数组的指针的描述中,正确的是( )
A. int (*p)[4] 可以指向任意二维数组
B. int (*p)[4] 只能指向列数为 4 的二维数组
C. int (*p)[4] 可以指向行数为 4 的二维数组
D. int (*p)[4] 是指针数组
【答案】B
【解析】数组指针的列数必须与指向的二维数组的列数一致,否则类型不匹配。
17.若有定义int a[5]={5,4,3,2,1}, *p=a;,则*(p+4)的值是( )
A. 5
B. 4
C. 1
D. 2
【答案】C
【解析】p+4 指向 a [4],值为 1。
18.执行以下程序段后,输出结果是( )
int a[5]={1,2,3,4,5}, *p=a, *q=&a[4];
printf("%d", q-p);
A. 4
B. 5
C. 20
D. 编译错误
【答案】A
【解析】同类型指针相减得到两个指针之间的元素个数,q-p=4。
19.以下用指针遍历数组的写法中,错误的是( )
A. for (p=a; p<a+5; p++) printf ("% d", *p);
B. for (p=a; *p!='\0'; p++) printf ("% d", *p);
C. for (i=0; i<5; i++) printf ("% d", *(a+i));
D. for (i=0; i<5; i++) printf ("% d", p [i]);
【答案】B
【解析】整型数组没有 '\0' 结束符,*p!='\0'会导致越界访问。
20.若有定义int a[3][4], (*p)[4]=a;,则p[2][3]等价于( )
A. a [2][3]
B. *(p+2)+3
C. *(*p+2)+3
D. *(p [2]+3)
【答案】A
【解析】数组指针 p 可以像二维数组名一样使用下标访问,p[2][3]等价于a[2][3]。
二、简答题(本大题共2小题,每题10分,共20分)
1.阅读以下 C 语言程序,程序运行后的结果为______
#include <stdio.h>
int main()
{
int a[5]={2,4,6,8,10};
int *p=a, i;
for(i=0; i<5; i++)
{
printf("%d ", *(p+i)*2);
}
printf("
");
return 0;
}
【答案】4 8 12 16 20
2.阅读以下 C 语言程序,程序运行后的结果为______
#include <stdio.h>
int main()
{
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int (*p)[3]=a, i;
for(i=0; i<3; i++)
{
printf("%d ", *(*p+i));
}
return 0;
}
【答案】1 2 3
三、案例分析题(本大题共1小题,每题10分,共10分)
1.以下程序的功能是:用指针实现数组元素的逆序存放。请在程序的下划线处填入正确的内容,使程序完整并能正确运行。
#include <stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
int *p=a, *q=&a[4], temp;
while(____1____)
{
temp=*p;
____2____;
____3____;
p++;
____4____;
}
for(int i=0; i<5; i++)
printf("%d ", a[i]);
return 0;
}
【答案】
1.p < q
2.*p = *q
3.*q = temp
4.q--
四、综合应用题(本大题共1小题,每题10分,共10分)
1.编写一个 C 语言程序,实现以下功能:定义一个包含 10 个元素的整型数组,要求输入 10 个整数存入数组,用指针遍历数组,计算数组所有元素的平均值并输出(保留两位小数)。
【答案】
#include <stdio.h>
int main()
{
int a[10], *p=a, sum=0, i;
float avg;
printf("请输入10个整数:");
for(i=0; i<10; i++)
{
scanf("%d", &a[i]);
}
for(p=a; p<a+10; p++)
{
sum += *p;
}
avg = sum / 10.0;
printf("数组元素的平均值为:%.2f
", avg);
return 0;
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$