第46卷 指针 《C语言程序设计》湖南省(对口招生)《计算机应用类考纲百套卷》

2026-07-31
| 2份
| 25页
| 30人阅读
| 0人下载

内容正文:

编写说明: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)逐项覆盖前一元素,并返回删除后的有效长度。 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 学科网(北京)股份有限公司 学科网(北京)股份有限公司 $

资源预览图

第46卷 指针 《C语言程序设计》湖南省(对口招生)《计算机应用类考纲百套卷》
1
第46卷 指针 《C语言程序设计》湖南省(对口招生)《计算机应用类考纲百套卷》
2
第46卷 指针 《C语言程序设计》湖南省(对口招生)《计算机应用类考纲百套卷》
3
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。