第32练 8.7 指针应用实例 《编程语言基础——C语言》 (第5版) 一课一练 (湖南)

2026-06-25
| 2份
| 11页
| 38人阅读
| 0人下载

内容正文:

【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。 本卷是《编程语言基础——C语言》(第5版)《一课一练》第32练,内容是8.7 指针应用实例。 《编程语言基础——C语言》(第5版)一课一练 第32练 8.7 指针应用实例 一、单选题 1. 以下关于指针的综合描述中,正确的是( ) A. 指针是C语言的精髓,通过指针可以直接访问内存,实现高效的数据操作 B. 指针变量只能指向整型数据 C. 使用指针可以完全替代数组的所有功能 D. 指针变量定义后会自动指向一个安全的内存地址 【答案】A 【解析】指针是C语言的核心特性,通过指针可以直接操作内存地址,实现灵活高效的程序设计。指针可以指向任意类型的变量、数组、字符串、结构体甚至函数。但指针必须显式初始化,不会自动指向安全地址。 2. 已定义 char *colors[] = {"Red", "Green", "Blue"}; 要输出第二个字符串,正确的语句是( ) A. printf("%s", *colors); B. printf("%s", colors[1]); C. printf("%s", colors[2]); D. printf("%s", *(colors + 0)); 【答案】B 【解析】colors是指针数组,colors[0]="Red",colors[1]="Green"(第二个字符串),colors[2]="Blue"。A输出第一个;C输出第三个(Blue);D等价于colors[0]也是第一个。 3. 要统计字符串中数字字符的个数,正确的函数实现是( ) A. int count(char *s) { int n=0; while(s) { if(*s>='0'&&*s<='9') n++; } return n; } B. int count(char s) { int n=0; while(s) { if(s>='0'&&s<='9') n++; s++; } return n; } C. int count(char *s) { int n=0; while(*s) { if(*s>='0'&&*s<='9') n++; s++; } return n; } D. int count(char *s) { int n=0; while(*s++) { if(*s>='0'&&*s<='9') n++; } return n; } 【答案】C 【解析】C中while(*s)判断当前字符是否为'\0',数字判断正确,s++移动到下一字符。A缺少s++会死循环;B参数类型错误(char而非char*);D中*和++的运算顺序导致先移动后判断,漏掉首字符,还多判断了一次。 4. 要用指针对数组int a[5]={1,2,3,4,5}进行逆序(变为{5,4,3,2,1}),以下思路正确的是( ) A. 定义一个指针,从a+4到a依次输出即可实现数组逆序 B. 定义两个指针分别指向a和a+4,通过一个临时变量交换指向的内容,两指针向中间靠拢 C. 定义新指针p=a+4,将*p依次赋给a[0]到a[4] D. B的做法可以正确实现,但A和C不能 【答案】D 【解析】B是正确方案:使用双指针法,p指向首元素,q指向末元素,交换*p和*q后p++、q--,直到p>=q。A完成逆序输出,未能真正修改数组数据;C会将a[4]的值赋给所有元素。 5. 函数 void process(int *a, int n) 用于对数组进行操作,下列调用方式正确的是( ) A. int arr[5]={1,2,3,4,5}; process(arr, 5); B. int arr[5]={1,2,3,4,5}; process(&arr, 5); C. int arr[5]={1,2,3,4,5}; process(*arr, 5); D. int arr[5]={1,2,3,4,5}; process(arr[0], 5); 【答案】A 【解析】函数形参int *a期望接收一个int型地址。数组名arr代表数组首地址,类型匹配。B中&arr类型为int(*)[5]与int*不匹配;C中*arr即arr[0],是整数值而非地址;D中arr[0]也是整数值。 6. 在C语言中,使用malloc函数动态分配内存的返回值类型是( ) A. int类型,返回分配的内存大小 B. void*类型,需要强制转换为目标指针类型 C. char*类型,始终返回字符指针 D. int*类型,始终返回整型指针 【答案】B 【解析】malloc函数原型为void* malloc(size_t size)。它返回void*类型的通用指针,使用时通常需要强制类型转换。例如:int *p = (int*)malloc(10*sizeof(int)); 分配10个int大小的连续内存空间。 7. 函数 char* findChar(char *s, char c) 用于在字符串中查找字符,返回指向找到位置的指针。若未找到应返回( ) A. '\0' B. 0 C. NULL D. s 【答案】C 【解析】返回指针的函数在查找失败时应返回NULL(空指针),表示未找到。NULL是一个值为0的指针常量,常用于表示指针未指向任何有效内存。A'\0'是字符不是指针;B中0虽值同NULL但类型歧义;D返回首地址不符合语义。 二、程序运行结果题 8. 以下程序的运行结果是【··】。 #include <stdio.h> void minMax(int *a, int n, int *min, int *max) { int i; *min = *max = a[0]; for (i = 1; i < n; i++) { if (a[i] < *min) *min = a[i]; if (a[i] > *max) *max = a[i]; } } main() { int arr[6] = {8, 3, 12, 5, 9, 1}, m1, m2; minMax(arr, 6, &m1, &m2); printf("%d,%d", m1, m2); } 【答案】1,12 【解析】minMax函数通过指针参数返回数组的最小值和最大值。遍历arr[6]:初始min=max=8。3<8→min=3;12>8→max=12;5<3不变;9<12不变;1<3→min=1。最终通过&m1和&m2返回最小值1和最大值12。 三、程序填空题 9. 以下程序的功能是:用指针实现将字符串s2连接到s1的末尾(不调用strcat)。请填空。 #include <stdio.h> main() { char s1[30] = "Hello ", s2[] = "World"; char *p = s1, *q = s2; while (*p) p++; while (*q) { 【1】; p++; q++; } *p = '\0'; printf("%s ", s1); } 【答案】【1】*p = *q 【解析】首先通过while(*p)p++将p移动到s1的'\0'处。然后进入连接循环:将q指向的字符复制到p指向的位置(*p=*q),然后p++和q++同时后移。循环直到*q为'\0',最后在p的位置添加'\0'结束字符串。 四、阅读程序改错题 10. 阅读以下程序,该程序的功能是定义一个函数返回两个数中较大值的地址。程序中有1处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。 L1 #include <stdio.h> L2 int* maxAddr(int a, int b) L3 { L4 int m; L5 m = a > b ? a : b; L6 return &m; L7 } L8 main() L9 { L10 int *p = maxAddr(10, 20); L11 printf("%d ", *p); L12 } 【答案】【1】L2-L6: 函数返回了局部变量m的地址(&m),函数结束后m被释放,p成为悬空指针。应改为通过参数返回:void maxAddr(int a, int b, int *result) { *result = a > b ? a : b; },调用时 int m; maxAddr(10,20,&m); 【解析】函数局部变量m在栈上分配,函数返回后该内存被释放。返回&m会导致调用者获得一个已失效的地址(悬空指针),访问*p是未定义行为。应通过指针参数将结果传出,这也是指针参数的典型应用。 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 学科网(北京)股份有限公司 $ 【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。 本卷是《编程语言基础——C语言》(第5版)《一课一练》第32练,内容是8.7 指针应用实例。 《编程语言基础——C语言》(第5版)一课一练 第32练 8.7 指针应用实例 一、单选题 1. 以下关于指针的综合描述中,正确的是( ) A. 指针是C语言的精髓,通过指针可以直接访问内存,实现高效的数据操作 B. 指针变量只能指向整型数据 C. 使用指针可以完全替代数组的所有功能 D. 指针变量定义后会自动指向一个安全的内存地址 2. 已定义 char *colors[] = {"Red", "Green", "Blue"}; 要输出第二个字符串,正确的语句是( ) A. printf("%s", *colors); B. printf("%s", colors[1]); C. printf("%s", colors[2]); D. printf("%s", *(colors + 0)); 3. 要统计字符串中数字字符的个数,正确的函数实现是( ) A. int count(char *s) { int n=0; while(s) { if(*s>='0'&&*s<='9') n++; } return n; } B. int count(char s) { int n=0; while(s) { if(s>='0'&&s<='9') n++; s++; } return n; } C. int count(char *s) { int n=0; while(*s) { if(*s>='0'&&*s<='9') n++; s++; } return n; } D. int count(char *s) { int n=0; while(*s++) { if(*s>='0'&&*s<='9') n++; } return n; } 4. 要用指针对数组int a[5]={1,2,3,4,5}进行逆序(变为{5,4,3,2,1}),以下思路正确的是( ) A. 定义一个指针,从a+4到a依次输出即可实现数组逆序 B. 定义两个指针分别指向a和a+4,通过一个临时变量交换指向的内容,两指针向中间靠拢 C. 定义新指针p=a+4,将*p依次赋给a[0]到a[4] D. B的做法可以正确实现,但A和C不能 5. 函数 void process(int *a, int n) 用于对数组进行操作,下列调用方式正确的是( ) A. int arr[5]={1,2,3,4,5}; process(arr, 5); B. int arr[5]={1,2,3,4,5}; process(&arr, 5); C. int arr[5]={1,2,3,4,5}; process(*arr, 5); D. int arr[5]={1,2,3,4,5}; process(arr[0], 5); 6. 在C语言中,使用malloc函数动态分配内存的返回值类型是( ) A. int类型,返回分配的内存大小 B. void*类型,需要强制转换为目标指针类型 C. char*类型,始终返回字符指针 D. int*类型,始终返回整型指针 7. 函数 char* findChar(char *s, char c) 用于在字符串中查找字符,返回指向找到位置的指针。若未找到应返回( ) A. '\0' B. 0 C. NULL D. s 二、程序运行结果题 8. 以下程序的运行结果是【··】。 #include <stdio.h> void minMax(int *a, int n, int *min, int *max) { int i; *min = *max = a[0]; for (i = 1; i < n; i++) { if (a[i] < *min) *min = a[i]; if (a[i] > *max) *max = a[i]; } } main() { int arr[6] = {8, 3, 12, 5, 9, 1}, m1, m2; minMax(arr, 6, &m1, &m2); printf("%d,%d", m1, m2); } 三、程序填空题 9. 以下程序的功能是:用指针实现将字符串s2连接到s1的末尾(不调用strcat)。请填空。 #include <stdio.h> main() { char s1[30] = "Hello ", s2[] = "World"; char *p = s1, *q = s2; while (*p) p++; while (*q) { 【1】; p++; q++; } *p = '\0'; printf("%s ", s1); } 四、阅读程序改错题 10. 阅读以下程序,该程序的功能是定义一个函数返回两个数中较大值的地址。程序中有1处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。 L1 #include <stdio.h> L2 int* maxAddr(int a, int b) L3 { L4 int m; L5 m = a > b ? a : b; L6 return &m; L7 } L8 main() L9 { L10 int *p = maxAddr(10, 20); L11 printf("%d ", *p); L12 } 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 学科网(北京)股份有限公司 $

资源预览图

第32练 8.7 指针应用实例 《编程语言基础——C语言》 (第5版) 一课一练 (湖南)
1
第32练 8.7 指针应用实例 《编程语言基础——C语言》 (第5版) 一课一练 (湖南)
2
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。