内容正文:
编写说明:2027版湖南省普通高等学校对口招生考试计算机应用类《考纲百套卷》,依据《2022年湖南省普通高等学校对口招生考试基本要求和考试大纲》编写。本专辑涵盖三个部分,第一部分为知识训练卷,第二部分为专题训练卷,第三部分为课程综合卷。本专辑共96份试卷,其中知识训练卷62份、专题训练卷21份、课程综合卷13份。
本试卷是第46卷,为知识训练卷,按《C语言程序设计》中“指针”范围和要求编写。具体内容为:⑤指针的概念及编程方法。(核心知识)。④指针的使用。(核心技能)。
湖南省对口招生考试
计算机应用类《考纲百套卷》
第46卷 C语言程序设计——指针
(考试时间:45分钟 满分:100分)
一、单项选择题(共20题,每题2分,共40分)
1.若变量x为int类型,指针p指向x的正确赋值是( )
A.p = &x
B.p = x
C.*p = &x
D.&p = x
2.若p为有效的int指针,表达式*p的结果是( )
A.p变量保存的地址
B.p所指整数的值
C.p所占用的字节数
D.数组p包含的元素数
3.指针变量p执行p++后,p通常指向( )
A.下一个字节位置
B.当前元素的地址
C.下一个同类型元素
D.数组最后一个元素
4.数组a作为函数实参时,函数通常接收到( )
A.整个数组数值副本
B.数组长度自动信息
C.最后元素地址信息
D.首元素地址信息
5.若函数参数声明为int *p,调用时通常应传入( )
A.int变量的地址
B.int变量的数值
C.int函数的返回值
D.数组长度的数值
6.使用指针参数修改主调函数变量的关键是( )
A.修改形参变量名称
B.对形参解引用赋值
C.修改函数返回类型
D.重新声明主函数变量
7.数组a有n个元素,a+n表示( )
A.最后元素的地址
B.首元素之前的位置
C.尾后位置的地址
D.数组元素个数的值
8.在同一数组中,p-q通常表示( )
A.两个地址相差的字节
B.数组总元素的个数
C.指针变量所占字节数
D.两个元素相隔的个数
9.表达式a[i]与指针表达式等价于( )
A.*(a + i)
B.*a + i
C.&(a + i)
D.&a + i
10.表达式(*p)++的作用是( )
A.指针地址增加1
B.所指对象增加1
C.所指对象减少1
D.指针指向首元素
11.表达式*p++的作用顺序是( )
A.先移动指针再取值
B.先修改所指对象
C.先取值再移动指针
D.先取得指针地址
12.指针p和NULL比较主要用于判断( )
A.p是否保存整数值
B.p是否已经自增
C.p是否指向数组尾部
D.p是否为空指针
13.未初始化的指针直接解引用可能导致( )
A.访问无效地址出错
B.自动分配一段内存
C.自动获得变量地址
D.自动返回整数零值
14.交换两个主调函数变量通常应传入( )
A.两个变量的副本
B.两个变量的地址
C.两个变量的类型名
D.两个变量的长度
15.指针数组和数组指针的主要区别在于( )
A.前者一定指向数组
B.后者元素是指针
C.前者元素是指针
D.后者不能进行运算
16.声明int (*p)[4]表示p是( )
A.含有四个指针的数组
B.指向一个整数的指针
C.返回四个整数的函数
D.指向四个整数数组的指针
17.二级指针int **p通常表示p保存( )
A.一级指针变量的地址
B.整数变量的直接数值
C.数组首元素的数值
D.函数返回类型的信息
18.指针作为循环变量遍历数组时,安全边界常写为( )
A.p <= a + n
B.p < a + n
C.p == a + n
D.p > a + n
19.函数返回局部变量地址的做法通常是( )
A.返回后地址有效
B.自动复制局部变量
C.返回后地址无效
D.自动延长变量寿命
20.使用const int *p时,通常表示通过p( )
A.不能读取所指整数
B.不能改变p的地址
C.不能进行指针比较
D.不能修改所指整数
二、程序填空题(共5题,每题4分,共20分)
1.下面程序通过指针参数修改两个整数,请在横线处填入适当内容。
#include <stdio.h>
void add_to(int *p, int value)
{
*p = *p + value;
}
int main()
{
int x = 15;
add_to(__________, 8);
printf("%d
", x);
return 0;
}
2.下面程序用指针遍历数组并计算奇数和,请在横线处填入适当内容。
#include <stdio.h>
int odd_sum(int *p, int n)
{
int i, sum = 0;
for (i = 0; i < n; i++)
if (__________)
sum += *(p + i);
return sum;
}
int main()
{
int a[6] = {2, 7, 4, 9, 5, 8};
printf("%d
", odd_sum(a, 6));
return 0;
}
3.下面程序通过指针参数返回数组最大值及其位置,请在横线处填入适当内容。
#include <stdio.h>
void find_max(int *a, int n, int *value, int *pos)
{
int i;
*value = a[0];
*pos = 0;
for (i = 1; i < n; i++)
if (a[i] > *value)
{
*value = __________;
*pos = i;
}
}
int main()
{
int a[5] = {6, 14, 9, 14, 3}, value, pos;
find_max(a, 5, &value, &pos);
printf("%d %d
", value, pos);
return 0;
}
4.下面程序通过指针交换数组首尾元素,请在横线处填入适当内容。
#include <stdio.h>
void swap_ends(int *a, int n)
{
int temp = a[0];
a[0] = a[__________];
a[n - 1] = temp;
}
int main()
{
int a[5] = {3, 6, 9, 12, 15}, i;
swap_ends(a, 5);
for (i = 0; i < 5; i++)
printf("%d ", a[i]);
return 0;
}
5.下面程序使用二级指针修改一级指针所指向的变量,请在横线处填入适当内容。
#include <stdio.h>
void set_pointer(int **pp, int *target)
{
__________ = target;
}
int main()
{
int a = 4, b = 9;
int *p = &a;
set_pointer(&p, &b);
printf("%d %d
", *p, a);
return 0;
}
三、程序改错题(共4题,每题4分,共16分)
1.下面程序用指针求数组元素和,其中有2处错误,请找出并改正。
#include <stdio.h>
int main()
{
int a[4] = {3, 5, 7, 9};
int *p, sum = 0;
for (p = a; p <= a + 4; p++)
sum += p;
printf("%d
", sum);
return 0;
}
2.下面程序通过指针参数给变量增加数值,其中有2处错误,请找出并改正。
#include <stdio.h>
void increase(int *p, int n)
{
p += n;
}
int main()
{
int x = 10;
increase(x, 5);
printf("%d
", x);
return 0;
}
3.下面程序交换数组中最大值和最小值,其中有2处错误,请找出并改正。
#include <stdio.h>
int main()
{
int a[5] = {8, 3, 11, 2, 6};
int *pmax = a, *pmin = a, *p, temp;
for (p = a + 1; p < a + 5; p++)
{
if (*p > *pmax)
pmax = p;
if (*p < *pmin)
pmin = p;
}
temp = *pmax;
*pmax = *pmin;
*pmin = pmax;
printf("%d %d %d %d %d
", a[0], a[1], a[2], a[3], a[4]);
return 0;
}
4.下面程序用二级指针让p指向变量b,其中有2处错误,请找出并改正。
#include <stdio.h>
void point_to(int **pp, int *target)
{
pp = target;
}
int main()
{
int a = 3, b = 8;
int *p = &a;
point_to(p, &b);
printf("%d %d
", *p, b);
return 0;
}
四、写程序运行结果题(共4题,每题4分,共16分)
1.写出下面程序的运行结果。
#include <stdio.h>
int main()
{
int x = 4, y = 7;
int *p = &x;
*p = *p + y;
y = *p - y;
printf("%d %d
", x, y);
return 0;
}
2.写出下面程序的运行结果。
#include <stdio.h>
int main()
{
int a[5] = {1, 3, 5, 7, 9};
int *p = a + 1;
printf("%d %d %d
", *p, *(p + 2), p - a);
return 0;
}
3.写出下面程序的运行结果。
#include <stdio.h>
void update(int *p, int n)
{
int i;
for (i = 0; i < n; i++)
*(p + i) += i;
}
int main()
{
int a[4] = {5, 5, 5, 5}, i;
update(a, 4);
for (i = 0; i < 4; i++)
printf("%d ", a[i]);
return 0;
}
4.写出下面程序的运行结果。
#include <stdio.h>
void redirect(int **pp, int *q)
{
*pp = q;
}
int main()
{
int a = 2, b = 6;
int *p = &a;
redirect(&p, &b);
*p += 3;
printf("%d %d
", a, b);
return 0;
}
五、程序设计题(共1题,共8分)
1.编写程序:输入7个整数存入数组,使用自定义函数和指针完成以下任务:统计正数、负数和零的个数;求数组中偶数元素的和;删除数组中第一个负数并用指针将后续元素前移;输出处理后的数组。要求删除操作通过指针参数返回新的有效长度。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
编写说明:2027版湖南省普通高等学校对口招生考试计算机应用类《考纲百套卷》,依据《2022年湖南省普通高等学校对口招生考试基本要求和考试大纲》编写。本专辑涵盖三个部分,第一部分为知识训练卷,第二部分为专题训练卷,第三部分为课程综合卷。本专辑共96份试卷,其中知识训练卷62份、专题训练卷21份、课程综合卷13份。
本试卷是第46卷,为知识训练卷,按《C语言程序设计》中“指针”范围和要求编写。具体内容为:⑤指针的概念及编程方法。(核心知识)。④指针的使用。(核心技能)。
湖南省对口招生考试
计算机应用类《考纲百套卷》
第46卷 C语言程序设计——指针
(考试时间:45分钟 满分:100分)
一、单项选择题(共20题,每题2分,共40分)
1.若变量x为int类型,指针p指向x的正确赋值是( )
A.p = &x
B.p = x
C.*p = &x
D.&p = x
【答案】A
【解析】p保存的是地址,x的地址用&x表示,因此应写p=&x。赋值完成后,*p可以访问变量x。
2.若p为有效的int指针,表达式*p的结果是( )
A.p变量保存的地址
B.p所指整数的值
C.p所占用的字节数
D.数组p包含的元素数
【答案】B
【解析】一元*对指针进行解引用,取得p所指向对象的内容,而不是取得指针本身的地址。
3.指针变量p执行p++后,p通常指向( )
A.下一个字节位置
B.当前元素的地址
C.下一个同类型元素
D.数组最后一个元素
【答案】C
【解析】指针自增会按所指类型的大小移动一个元素位置,所以p++通常指向同一数组中的下一个同类型元素。
4.数组a作为函数实参时,函数通常接收到( )
A.整个数组数值副本
B.数组长度自动信息
C.最后元素地址信息
D.首元素地址信息
【答案】D
【解析】数组名在函数调用中通常转换为指向首元素的指针,函数可通过指针访问原数组,但不会自动获得数组长度。
5.若函数参数声明为int *p,调用时通常应传入( )
A.int变量的地址
B.int变量的数值
C.int函数的返回值
D.数组长度的数值
【答案】A
【解析】int *p要求接收int对象的地址,例如f(&x),函数内部可通过*p访问x。
6.使用指针参数修改主调函数变量的关键是( )
A.修改形参变量名称
B.对形参解引用赋值
C.修改函数返回类型
D.重新声明主函数变量
【答案】B
【解析】形参保存了实参地址时,应通过*p等解引用表达式修改地址对应的原变量。
7.数组a有n个元素,a+n表示( )
A.最后元素的地址
B.首元素之前的位置
C.尾后位置的地址
D.数组元素个数的值
【答案】C
【解析】a+n是数组尾后指针,表示最后一个元素之后的位置,可用于边界比较但不能解引用。
8.在同一数组中,p-q通常表示( )
A.两个地址相差的字节
B.数组总元素的个数
C.指针变量所占字节数
D.两个元素相隔的个数
【答案】D
【解析】同一数组内指针相减的结果是元素间的距离,结果的单位是数组元素个数而不是字节数。
9.表达式a[i]与指针表达式等价于( )
A.*(a + i)
B.*a + i
C.&(a + i)
D.&a + i
【答案】A
【解析】C语言规定下标运算a[i]等价于*(a+i),表示从数组首地址偏移i个元素后取值。
10.表达式(*p)++的作用是( )
A.指针地址增加1
B.所指对象增加1
C.所指对象减少1
D.指针指向首元素
【答案】B
【解析】括号保证先解引用,再对p所指的对象执行自增;它不会改变p本身指向的位置。
11.表达式*p++的作用顺序是( )
A.先移动指针再取值
B.先修改所指对象
C.先取值再移动指针
D.先取得指针地址
【答案】C
【解析】后缀++优先级高于一元*,所以表达式等价于*(p++),先取当前位置的值,随后p移动到下一位置。
12.指针p和NULL比较主要用于判断( )
A.p是否保存整数值
B.p是否已经自增
C.p是否指向数组尾部
D.p是否为空指针
【答案】D
【解析】NULL表示空指针常量,p==NULL可判断p当前是否没有指向可访问对象。
13.未初始化的指针直接解引用可能导致( )
A.访问无效地址出错
B.自动分配一段内存
C.自动获得变量地址
D.自动返回整数零值
【答案】A
【解析】未初始化指针中的地址不确定,直接使用*p可能访问无效区域,产生运行错误或未定义行为。
14.交换两个主调函数变量通常应传入( )
A.两个变量的副本
B.两个变量的地址
C.两个变量的类型名
D.两个变量的长度
【答案】B
【解析】只有传入两个变量的地址,交换函数才能通过指针参数修改调用者中的原变量。
15.指针数组和数组指针的主要区别在于( )
A.前者一定指向数组
B.后者元素是指针
C.前者元素是指针
D.后者不能进行运算
【答案】C
【解析】指针数组是数组,其每个元素都是指针;数组指针是一个指针,指向一个数组整体。
16.声明int (*p)[4]表示p是( )
A.含有四个指针的数组
B.指向一个整数的指针
C.返回四个整数的函数
D.指向四个整数数组的指针
【答案】D
【解析】括号使*p先结合,p是指向含4个int元素的一维数组的指针,而不是指针数组。
17.二级指针int **p通常表示p保存( )
A.一级指针变量的地址
B.整数变量的直接数值
C.数组首元素的数值
D.函数返回类型的信息
【答案】A
【解析】int **p是指向int*类型对象的指针,通常用于保存一级指针变量的地址并间接修改一级指针。
18.指针作为循环变量遍历数组时,安全边界常写为( )
A.p <= a + n
B.p < a + n
C.p == a + n
D.p > a + n
【答案】B
【解析】a+n是尾后位置,只有p<a+n时解引用*p才会访问数组内元素,使用<=会访问尾后位置。
19.函数返回局部变量地址的做法通常是( )
A.返回后地址有效
B.自动复制局部变量
C.返回后地址无效
D.自动延长变量寿命
【答案】C
【解析】函数返回后局部变量的生命周期结束,返回其地址会得到悬空指针,不能继续安全访问。
20.使用const int *p时,通常表示通过p( )
A.不能读取所指整数
B.不能改变p的地址
C.不能进行指针比较
D.不能修改所指整数
【答案】D
【解析】const int *p限制通过p修改所指int对象,但p本身仍可指向其他位置,且可以读取所指值。
二、程序填空题(共5题,每题4分,共20分)
1.下面程序通过指针参数修改两个整数,请在横线处填入适当内容。
#include <stdio.h>
void add_to(int *p, int value)
{
*p = *p + value;
}
int main()
{
int x = 15;
add_to(__________, 8);
printf("%d
", x);
return 0;
}
【答案】&x(4分)。
【解析】add_to的第一个参数是int指针,调用时应传入x的地址&x;函数通过*p把8加到原变量x上,结果为23。
2.下面程序用指针遍历数组并计算奇数和,请在横线处填入适当内容。
#include <stdio.h>
int odd_sum(int *p, int n)
{
int i, sum = 0;
for (i = 0; i < n; i++)
if (__________)
sum += *(p + i);
return sum;
}
int main()
{
int a[6] = {2, 7, 4, 9, 5, 8};
printf("%d
", odd_sum(a, 6));
return 0;
}
【答案】*(p + i) % 2 != 0(4分)。
【解析】当前元素通过*(p+i)访问,奇数的条件是除以2的余数不为0;数组中的奇数7、9、5之和为21。
3.下面程序通过指针参数返回数组最大值及其位置,请在横线处填入适当内容。
#include <stdio.h>
void find_max(int *a, int n, int *value, int *pos)
{
int i;
*value = a[0];
*pos = 0;
for (i = 1; i < n; i++)
if (a[i] > *value)
{
*value = __________;
*pos = i;
}
}
int main()
{
int a[5] = {6, 14, 9, 14, 3}, value, pos;
find_max(a, 5, &value, &pos);
printf("%d %d
", value, pos);
return 0;
}
【答案】a[i](4分)。
【解析】当a[i]大于当前最大值时,应把a[i]写入*value并记录位置i。相等时不更新,因此最大值14保留第一次出现的位置1。
4.下面程序通过指针交换数组首尾元素,请在横线处填入适当内容。
#include <stdio.h>
void swap_ends(int *a, int n)
{
int temp = a[0];
a[0] = a[__________];
a[n - 1] = temp;
}
int main()
{
int a[5] = {3, 6, 9, 12, 15}, i;
swap_ends(a, 5);
for (i = 0; i < 5; i++)
printf("%d ", a[i]);
return 0;
}
【答案】n - 1(4分)。
【解析】数组首元素下标为0,末元素下标为n-1。先保存a[0],再用a[n-1]覆盖首元素,最后把temp写到末元素。
5.下面程序使用二级指针修改一级指针所指向的变量,请在横线处填入适当内容。
#include <stdio.h>
void set_pointer(int **pp, int *target)
{
__________ = target;
}
int main()
{
int a = 4, b = 9;
int *p = &a;
set_pointer(&p, &b);
printf("%d %d
", *p, a);
return 0;
}
【答案】*pp(4分)。
【解析】调用时& p是一级指针p的地址,形参pp为二级指针。通过*pp可以修改p本身,使p改为指向b,输出9和4。
三、程序改错题(共4题,每题4分,共16分)
1.下面程序用指针求数组元素和,其中有2处错误,请找出并改正。
#include <stdio.h>
int main()
{
int a[4] = {3, 5, 7, 9};
int *p, sum = 0;
for (p = a; p <= a + 4; p++)
sum += p;
printf("%d
", sum);
return 0;
}
【答案】(1)p <= a + 4改为p < a + 4;(2)sum += p;改为sum += *p;
【解析】a+4是数组尾后指针,不能对该位置解引用;p保存地址,求和时必须使用*p取得当前元素值。
2.下面程序通过指针参数给变量增加数值,其中有2处错误,请找出并改正。
#include <stdio.h>
void increase(int *p, int n)
{
p += n;
}
int main()
{
int x = 10;
increase(x, 5);
printf("%d
", x);
return 0;
}
【答案】(1)p += n;改为*p += n;(2)increase(x, 5);改为increase(&x, 5);
【解析】函数的目标是修改x的数值,应通过*p增加n;调用指针参数函数时应传入&x,不能直接传入x的数值。
3.下面程序交换数组中最大值和最小值,其中有2处错误,请找出并改正。
#include <stdio.h>
int main()
{
int a[5] = {8, 3, 11, 2, 6};
int *pmax = a, *pmin = a, *p, temp;
for (p = a + 1; p < a + 5; p++)
{
if (*p > *pmax)
pmax = p;
if (*p < *pmin)
pmin = p;
}
temp = *pmax;
*pmax = *pmin;
*pmin = pmax;
printf("%d %d %d %d %d
", a[0], a[1], a[2], a[3], a[4]);
return 0;
}
【答案】(1)*pmin = pmax;改为*pmin = temp;(2)保留pmax、pmin指针交换逻辑,不应把地址赋给整数。
【解析】temp保存最大值,交换后应把temp写入最小值所在元素*pmin。pmax是地址,不能直接赋给int元素;题中最大值11和最小值2应完成数值交换。
4.下面程序用二级指针让p指向变量b,其中有2处错误,请找出并改正。
#include <stdio.h>
void point_to(int **pp, int *target)
{
pp = target;
}
int main()
{
int a = 3, b = 8;
int *p = &a;
point_to(p, &b);
printf("%d %d
", *p, b);
return 0;
}
【答案】(1)pp = target;改为*pp = target;(2)point_to(p, &b);改为point_to(&p, &b);
【解析】pp是指向一级指针的二级指针,需通过*pp修改p;调用时传入&p才能把p的地址交给pp,修改后p才会指向b。
四、写程序运行结果题(共4题,每题4分,共16分)
1.写出下面程序的运行结果。
#include <stdio.h>
int main()
{
int x = 4, y = 7;
int *p = &x;
*p = *p + y;
y = *p - y;
printf("%d %d
", x, y);
return 0;
}
【答案】11 4
【解析】p指向x,第一步使x变为11;第二步用*p-y计算得到4并赋给y,所以输出11 4。
2.写出下面程序的运行结果。
#include <stdio.h>
int main()
{
int a[5] = {1, 3, 5, 7, 9};
int *p = a + 1;
printf("%d %d %d
", *p, *(p + 2), p - a);
return 0;
}
【答案】3 7 1
【解析】p指向a[1],*p为3;p+2指向a[3],值为7;同一数组内p-a表示下标距离1。
3.写出下面程序的运行结果。
#include <stdio.h>
void update(int *p, int n)
{
int i;
for (i = 0; i < n; i++)
*(p + i) += i;
}
int main()
{
int a[4] = {5, 5, 5, 5}, i;
update(a, 4);
for (i = 0; i < 4; i++)
printf("%d ", a[i]);
return 0;
}
【答案】5 6 7 8
【解析】函数通过a接收数组首地址,依次给下标0、1、2、3的元素加上对应下标,数组变为5、6、7、8。
4.写出下面程序的运行结果。
#include <stdio.h>
void redirect(int **pp, int *q)
{
*pp = q;
}
int main()
{
int a = 2, b = 6;
int *p = &a;
redirect(&p, &b);
*p += 3;
printf("%d %d
", a, b);
return 0;
}
【答案】2 9
【解析】redirect通过二级指针把p改为指向b,之后*p+=3实际修改b,a保持2,b变为9。
五、程序设计题(共1题,共8分)
1.编写程序:输入7个整数存入数组,使用自定义函数和指针完成以下任务:统计正数、负数和零的个数;求数组中偶数元素的和;删除数组中第一个负数并用指针将后续元素前移;输出处理后的数组。要求删除操作通过指针参数返回新的有效长度。
【答案】参考程序如下。评分点:正确通过指针参数统计三类数据(2分);正确使用指针求偶数和(2分);正确查找第一个负数并前移后续元素(2分);正确返回并使用新长度(1分);输入输出和程序结构正确(1分)。
#include <stdio.h>
void count_sign(int *a, int n, int *positive, int *negative, int *zero)
{
int i;
*positive = *negative = *zero = 0;
for (i = 0; i < n; i++)
{
if (*(a + i) > 0)
(*positive)++;
else if (*(a + i) < 0)
(*negative)++;
else
(*zero)++;
}
}
int even_sum(int *a, int n)
{
int i, sum = 0;
for (i = 0; i < n; i++)
if (*(a + i) % 2 == 0)
sum += *(a + i);
return sum;
}
int remove_first_negative(int *a, int n)
{
int i, pos = -1;
for (i = 0; i < n; i++)
if (*(a + i) < 0)
{
pos = i;
break;
}
if (pos == -1)
return n;
for (i = pos; i < n - 1; i++)
*(a + i) = *(a + i + 1);
return n - 1;
}
int main()
{
int a[7], n = 7, i, positive, negative, zero, new_n;
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
count_sign(a, n, &positive, &negative, &zero);
printf("positive=%d negative=%d zero=%d even_sum=%d
", positive, negative, zero, even_sum(a, n));
new_n = remove_first_negative(a, n);
for (i = 0; i < new_n; i++)
printf("%d ", a[i]);
return 0;
}
【解析】程序先通过count_sign把三个计数结果写回主函数,再用even_sum遍历指针求偶数和;remove_first_negative找到首个负数位置后,通过*(a+i)逐项覆盖前一元素,并返回删除后的有效长度。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$