内容正文:
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《C语言》(第五版)《一课一练》第35练,内容是8.6-8.7 结构体指针变量、指针应用实例。
《C语言》(第五版)一课一练 第35练
8.6-8.7 结构体指针变量、指针应用实例
一、单选题
1. 设有定义 struct Stu { int num; float score; } s={101,85.5}; 以下能正确定义指向s的指针的是( )
A. struct Stu *p = s;
B. Stu *p = &s;
C. struct Stu *p = &s;
D. struct Stu p = &s;
2. 设有定义 struct Stu { int num; float score; } s={101,85.5}, *p=&s; 则以下能正确访问s的num成员的是( )
A. p->num
B. p.num
C. *p.num
D. &p->num
3. 以下关于结构体指针作为函数参数的描述中,正确的是( )
A. 传递结构体指针时,函数内无法修改结构体成员的值
B. 结构体指针参数与结构体值参数效果完全相同
C. 传递结构体指针比传递结构体值更安全
D. 传递结构体指针可以避免结构体的整体复制,提高效率
4. 设有定义 struct Stu { int num; float score; } s[3]={{101,80},{102,90},{103,70}}, *p=s; 则表达式 (p+1)->score 的值是( )
A. 80
B. 90
C. 70
D. 101
5. 设有定义 struct Stu { int num; char name[20]; float score; } s[3], *p=s; 执行 p+=2; 后,p指向的元素是( )
A. s[2]
B. s[1]
C. s[0]
D. s[3]
6. 以下程序片段中,能正确为结构体指针分配内存的是( )
A. struct Stu { int num; float score; }; struct Stu *p = malloc(struct Stu);
B. struct Stu { int num; float score; }; struct Stu p = malloc(sizeof(struct Stu));
C. struct Stu { int num; float score; }; struct Stu *p = (struct Stu *)malloc(sizeof(struct Stu));
D. struct Stu { int num; float score; }; struct Stu *p = (struct Stu *)malloc(sizeof(p));
7. 以下程序片段的输出结果是
struct T { int x; int y; } a = {3, 4}, *p = &a;
int b;
b = p->x * (*p).y;
p->x = 10;
printf("%d %d", b, a.x);( )
A. 12 3
B. 10 10
C. 40 10
D. 12 10
二、简答题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
struct Stu {
int num;
char name[20];
float score;
};
void printStu(struct Stu *p)
{
printf("%d %s %.1f
", p->num, p->name, p->score);
}
main()
{
struct Stu s[3] = {{101, "Wang", 85}, {102, "Li", 92}, {103, "Zhang", 78}};
struct Stu *p;
for (p = s; p < s + 3; p++)
printStu(p);
}
三、案例分析题
9. 以下程序的功能是使用结构体指针查找成绩最高的学生并输出其信息。请填空。
#include <stdio.h>
struct Stu {
int num;
char name[20];
float score;
};
main()
{
struct Stu s[3] = {{101, "Wang", 85}, {102, "Li", 92}, {103, "Zhang", 78}};
struct Stu *p, *max;
max = 【1】;
for (p = s; p < s + 3; p++)
if (p->score > 【2】)
max = p;
printf("最高分:%d %s %.1f
", 【3】, max->name, max->score);
}
四、综合应用题
10. 编写一个C程序:定义结构体类型Student,包含学号num(整型)、姓名name(字符数组)和成绩score(浮点型)。定义一个包含3个元素的结构体数组并初始化。编写函数updateScore,使用结构体指针参数修改指定学号学生的成绩。在main中调用该函数将学号为102的学生成绩改为95.0,输出修改后全部学生信息。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《C语言》(第五版)《一课一练》第35练,内容是8.6-8.7 结构体指针变量、指针应用实例。
《C语言》(第五版)一课一练 第35练
8.6-8.7 结构体指针变量、指针应用实例
一、单选题
1. 设有定义 struct Stu { int num; float score; } s={101,85.5}; 以下能正确定义指向s的指针的是( )
A. struct Stu *p = s;
B. Stu *p = &s;
C. struct Stu *p = &s;
D. struct Stu p = &s;
【答案】C
【解析】定义结构体指针变量并使其指向s,需要用&s取s的地址赋给指针p。C中struct Stu *p=&s正确。A中s是结构体变量不是地址,应加&。B中缺少struct关键字。D中p没有*号,p是结构体变量不是指针,类型不匹配。
2. 设有定义 struct Stu { int num; float score; } s={101,85.5}, *p=&s; 则以下能正确访问s的num成员的是( )
A. p->num
B. p.num
C. *p.num
D. &p->num
【答案】A
【解析】通过结构体指针访问成员使用指向运算符->,p->num等价于(*p).num。A正确。B中p是指针不是结构体变量,不能用点运算符。C中*p.num由于运算符优先级,等价于*(p.num),p没有num成员,语法错误。D中&p->num取的是num成员的地址,不是num的值。
3. 以下关于结构体指针作为函数参数的描述中,正确的是( )
A. 传递结构体指针时,函数内无法修改结构体成员的值
B. 结构体指针参数与结构体值参数效果完全相同
C. 传递结构体指针比传递结构体值更安全
D. 传递结构体指针可以避免结构体的整体复制,提高效率
【答案】D
【解析】传递结构体指针时,函数接收的是地址,不需要复制整个结构体,效率更高。A错误,通过指针可以修改结构体成员。B错误,值传递是复制,函数内修改不影响原结构体;指针传递可以修改原结构体。C错误,指针传递可以修改原数据,需要谨慎使用,不一定更安全。
4. 设有定义 struct Stu { int num; float score; } s[3]={{101,80},{102,90},{103,70}}, *p=s; 则表达式 (p+1)->score 的值是( )
A. 80
B. 90
C. 70
D. 101
【答案】B
【解析】p指向s[0],p+1指向s[1](即{102,90}),(p+1)->score访问s[1].score=90。结构体指针加1移动一个结构体元素的位置。A是p->score即s[0].score=80。C是(p+2)->score即s[2].score=70。D是s[0].num的值,不是score成员。
5. 设有定义 struct Stu { int num; char name[20]; float score; } s[3], *p=s; 执行 p+=2; 后,p指向的元素是( )
A. s[2]
B. s[1]
C. s[0]
D. s[3]
【答案】A
【解析】p初始指向s[0](即数组首元素),p+=2使指针向后移动2个结构体元素的位置,指向s[2]。指针加减整数是以所指类型的大小为单位移动的,不是以字节为单位。D中s[3]已越界。
6. 以下程序片段中,能正确为结构体指针分配内存的是( )
A. struct Stu { int num; float score; }; struct Stu *p = malloc(struct Stu);
B. struct Stu { int num; float score; }; struct Stu p = malloc(sizeof(struct Stu));
C. struct Stu { int num; float score; }; struct Stu *p = (struct Stu *)malloc(sizeof(struct Stu));
D. struct Stu { int num; float score; }; struct Stu *p = (struct Stu *)malloc(sizeof(p));
【答案】C
【解析】C正确:malloc参数为sizeof(struct Stu)计算结构体大小,返回值强制转换为struct Stu*类型。A中malloc参数应是字节数而非类型名,struct Stu不是合法参数。B中p是结构体变量不是指针,不能接收malloc返回的地址。D中sizeof(p)是指针本身的大小(4或8字节),不是结构体的大小。
7. 以下程序片段的输出结果是
struct T { int x; int y; } a = {3, 4}, *p = &a;
int b;
b = p->x * (*p).y;
p->x = 10;
printf("%d %d", b, a.x);( )
A. 12 3
B. 10 10
C. 40 10
D. 12 10
【答案】D
【解析】p->x即a.x=3,(*p).y即a.y=4,b=3*4=12。然后p->x=10修改了a.x为10。输出b=12和a.x=10,结果为12 10。p->x和(*p).x是等价的两种写法,都通过指针访问结构体成员。
二、简答题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
struct Stu {
int num;
char name[20];
float score;
};
void printStu(struct Stu *p)
{
printf("%d %s %.1f
", p->num, p->name, p->score);
}
main()
{
struct Stu s[3] = {{101, "Wang", 85}, {102, "Li", 92}, {103, "Zhang", 78}};
struct Stu *p;
for (p = s; p < s + 3; p++)
printStu(p);
}
【答案】101 Wang 85.0
102 Li 92.0
103 Zhang 78.0
【解析】程序定义printStu函数接收结构体指针参数,通过->运算符访问成员并输出。main中用指针p遍历结构体数组s,每次将p传给printStu。p从s[0]开始,依次指向s[0]、s[1]、s[2],输出三个学生的信息。
三、案例分析题
9. 以下程序的功能是使用结构体指针查找成绩最高的学生并输出其信息。请填空。
#include <stdio.h>
struct Stu {
int num;
char name[20];
float score;
};
main()
{
struct Stu s[3] = {{101, "Wang", 85}, {102, "Li", 92}, {103, "Zhang", 78}};
struct Stu *p, *max;
max = 【1】;
for (p = s; p < s + 3; p++)
if (p->score > 【2】)
max = p;
printf("最高分:%d %s %.1f
", 【3】, max->name, max->score);
}
【答案】【1】s
【2】max->score
【3】max->num
【解析】【1】max初始应指向数组首元素s[0],即s。【2】比较条件为当前元素成绩大于已知最大值,max->score为当前最大成绩。【3】输出学号应使用max->num。程序通过结构体指针遍历数组,max指针始终指向成绩最高的元素。
四、综合应用题
10. 编写一个C程序:定义结构体类型Student,包含学号num(整型)、姓名name(字符数组)和成绩score(浮点型)。定义一个包含3个元素的结构体数组并初始化。编写函数updateScore,使用结构体指针参数修改指定学号学生的成绩。在main中调用该函数将学号为102的学生成绩改为95.0,输出修改后全部学生信息。
【答案】#include <stdio.h>
struct Student {
int num;
char name[20];
float score;
};
void updateScore(struct Student *p, int n, int target, float newScore)
{
int i;
for (i = 0; i < n; i++)
{
if (p[i].num == target)
{
p[i].score = newScore;
break;
}
}
}
main()
{
struct Student s[3] = {{101, "Wang", 85}, {102, "Li", 88}, {103, "Zhang", 78}};
int i;
updateScore(s, 3, 102, 95.0);
for (i = 0; i < 3; i++)
printf("%d %s %.1f
", s[i].num, s[i].name, s[i].score);
}
【解析】updateScore函数接收结构体指针p、元素个数n、目标学号target和新成绩newScore。遍历数组查找匹配学号,通过指针修改该学生的成绩。main中调用时传入数组名s(首地址)、元素个数3、学号102和新成绩95.0。函数通过指针直接修改原数组中的数据。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$