内容正文:
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《编程语言基础——C语言》(第5版)《一课一练》第31练,内容是8.5 指针作为函数参数 + 8.6 指向结构体的指针变量。
《编程语言基础——C语言》(第5版)一课一练 第31练
8.5 指针作为函数参数 + 8.6 指向结构体的指针变量
一、单选题
1. 使用指针作为函数参数的主要目的是( )
A. 使函数能够修改调用处变量的值
B. 使函数运行速度变快
C. 减少函数中局部变量的使用
D. 使函数能返回多个值
2. 有以下两个函数:void f1(int x) { x = 100; } 和 void f2(int *x) { *x = 100; }。主函数中 int a = 10; 分别调用f1(a)和f2(&a)后,a的值分别为( )
A. 100, 10
B. 10, 100
C. 100, 100
D. 10, 10
3. 已定义 struct Student { int num; char name[20]; }; 要定义一个指向Student类型的指针p,正确的是( )
A. Student *p;
B. struct *p;
C. struct Student *p;
D. *struct Student p;
4. 已定义 struct Point { int x; int y; } a = {3, 5}, *p = &a; 以下能正确输出a的x成员值的是( )
A. printf("%d", *p.x);
B. printf("%d", p.x);
C. printf("%d", *p->x);
D. printf("%d", p->x);
5. 函数定义 void setScore(struct Student *p, float s) { p->score = s; } 中,调用 setScore(&stu, 90); 后( )
A. stu的score成员被修改为90
B. stu的值没有变化,因为p是形参
C. stu的地址被修改了
D. p指向了新的Student变量
6. 实现交换两个整型变量值的函数,正确定义是( )
A. void swap(int a, int b) { int t=a; a=b; b=t; }
B. void swap(int *a, int *b) { int t=*a; *a=*b; *b=t; }
C. void swap(int a, int b) { int *t=&a; a=b; b=*t; }
D. void swap(int *a, int *b) { int *t=a; a=b; b=t; }
7. 已定义 struct Student { int num; float score; } s[3] = {{1,80},{2,90},{3,70}}; struct Student *p = s; 则 (p+1)->score 的值是( )
A. 80
B. 70
C. 90
D. s[0]的地址
二、程序运行结果题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
void swap(int *x, int *y)
{
int t;
t = *x;
*x = *y;
*y = t;
}
main()
{
int a = 5, b = 12;
swap(&a, &b);
printf("a=%d,b=%d", a, b);
}
三、程序填空题
9. 以下程序的功能是:通过结构体指针输入并输出学生信息。请填空。
#include <stdio.h>
struct Student
{
int num;
char name[20];
};
void input(struct Student *p)
{
printf("请输入学号和姓名:");
scanf("%d%s", &p->num, 【1】);
}
main()
{
struct Student stu;
input(&stu);
printf("学号:%d,姓名:%s
", stu.num, stu.name);
}
四、阅读程序改错题
10. 阅读以下程序,该程序的功能是定义一个函数将传入的整数翻倍,并在主函数中输出翻倍后的结果。程序中有1处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。
L1 #include <stdio.h>
L2 void doubleNum(int x)
L3 {
L4 x = x * 2;
L5 }
L6 main()
L7 {
L8 int a = 5;
L9 doubleNum(a);
L10 printf("%d
", a);
L11 }
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《编程语言基础——C语言》(第5版)《一课一练》第31练,内容是8.5 指针作为函数参数 + 8.6 指向结构体的指针变量。
《编程语言基础——C语言》(第5版)一课一练 第31练
8.5 指针作为函数参数 + 8.6 指向结构体的指针变量
一、单选题
1. 使用指针作为函数参数的主要目的是( )
A. 使函数能够修改调用处变量的值
B. 使函数运行速度变快
C. 减少函数中局部变量的使用
D. 使函数能返回多个值
【答案】A
【解析】C语言函数参数默认为值传递,形参是实参的副本,函数内修改形参不影响实参。使用指针作为参数时,函数通过地址间接访问和修改外部变量,实现了双向数据传递。
2. 有以下两个函数:void f1(int x) { x = 100; } 和 void f2(int *x) { *x = 100; }。主函数中 int a = 10; 分别调用f1(a)和f2(&a)后,a的值分别为( )
A. 100, 10
B. 10, 100
C. 100, 100
D. 10, 10
【答案】B
【解析】f1(a)是值传递,x是a的副本,x=100不影响a,a仍为10。f2(&a)传递a的地址,*x等价于a,*x=100修改的是a本身,因此a变为100。这就是指针参数实现双向传递的关键。
3. 已定义 struct Student { int num; char name[20]; }; 要定义一个指向Student类型的指针p,正确的是( )
A. Student *p;
B. struct *p;
C. struct Student *p;
D. *struct Student p;
【答案】C
【解析】定义结构体指针的格式为:struct 结构体名 *指针变量名; C正确。A缺少struct关键字(除非使用了typedef);B缺少结构体名;D语法错误。定义后可以让p指向一个已有的结构体变量:p=&s。
4. 已定义 struct Point { int x; int y; } a = {3, 5}, *p = &a; 以下能正确输出a的x成员值的是( )
A. printf("%d", *p.x);
B. printf("%d", p.x);
C. printf("%d", *p->x);
D. printf("%d", p->x);
【答案】D
【解析】p是指向结构体变量a的指针,通过指针访问结构体成员有两种等价方式:(*p).x 和 p->x。->是专门用于结构体指针访问成员的运算符。A中.优先级高于*;B中p不是结构体变量;C多了一个*。
5. 函数定义 void setScore(struct Student *p, float s) { p->score = s; } 中,调用 setScore(&stu, 90); 后( )
A. stu的score成员被修改为90
B. stu的值没有变化,因为p是形参
C. stu的地址被修改了
D. p指向了新的Student变量
【答案】A
【解析】函数接收结构体指针p(指向stu),p->score=s等价于(*p).score=s,即stu.score=s。通过指针参数,函数直接修改了stu的score成员。这是指针参数在实际编程中的重要应用。
6. 实现交换两个整型变量值的函数,正确定义是( )
A. void swap(int a, int b) { int t=a; a=b; b=t; }
B. void swap(int *a, int *b) { int t=*a; *a=*b; *b=t; }
C. void swap(int a, int b) { int *t=&a; a=b; b=*t; }
D. void swap(int *a, int *b) { int *t=a; a=b; b=t; }
【答案】B
【解析】要交换两个外部变量的值,必须使用指针参数。B中*a和*b访问a和b指向的变量,通过临时变量t完成值交换。A是值传递,形参的改变不返回;C同样值传递无效;D交换的是指针本身而非指向的值。
7. 已定义 struct Student { int num; float score; } s[3] = {{1,80},{2,90},{3,70}}; struct Student *p = s; 则 (p+1)->score 的值是( )
A. 80
B. 70
C. 90
D. s[0]的地址
【答案】C
【解析】p指向s[0],p+1指向s[1]。(p+1)->score等价于s[1].score=90。结构体指针的算术运算同样以结构体类型大小为步长,p+1移动到下一个结构体元素的起始地址。
二、程序运行结果题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
void swap(int *x, int *y)
{
int t;
t = *x;
*x = *y;
*y = t;
}
main()
{
int a = 5, b = 12;
swap(&a, &b);
printf("a=%d,b=%d", a, b);
}
【答案】a=12,b=5
【解析】swap函数通过指针参数交换两个变量的值。调用swap(&a,&b)时:t=*x即t=5,*x=*y即a=b=12,*y=t即b=5。由于传递的是地址,函数直接修改了main中的a和b,输出a=12,b=5。
三、程序填空题
9. 以下程序的功能是:通过结构体指针输入并输出学生信息。请填空。
#include <stdio.h>
struct Student
{
int num;
char name[20];
};
void input(struct Student *p)
{
printf("请输入学号和姓名:");
scanf("%d%s", &p->num, 【1】);
}
main()
{
struct Student stu;
input(&stu);
printf("学号:%d,姓名:%s
", stu.num, stu.name);
}
【答案】【1】p->name
【解析】input函数通过结构体指针p接收学生信息。p->num是int成员,需要&p->num取地址传给scanf;p->name是字符数组名,本身代表首地址,直接传给scanf即可。->是结构体指针访问成员的运算符。
四、阅读程序改错题
10. 阅读以下程序,该程序的功能是定义一个函数将传入的整数翻倍,并在主函数中输出翻倍后的结果。程序中有1处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。
L1 #include <stdio.h>
L2 void doubleNum(int x)
L3 {
L4 x = x * 2;
L5 }
L6 main()
L7 {
L8 int a = 5;
L9 doubleNum(a);
L10 printf("%d
", a);
L11 }
【答案】【1】L2-L4: void doubleNum(int x) { x = x * 2; } → 应改为 void doubleNum(int *x) { *x = *x * 2; };同时 L9改为 doubleNum(&a);(值传递不能修改实参,需改为指针参数实现双向传递)
【解析】L2的函数使用值传递,形参x是实参a的副本,函数内x=x*2不影响a的值。要修改外部变量a,需要改为指针参数:形参为int *x,函数内用*x=*x*2,调用时传&a。这是指针作为函数参数最经典的应用。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$