内容正文:
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《编程语言基础——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 }
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$