内容正文:
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《C语言》(第五版)《一课一练》第32练,内容是8.1-8.2 指针概念、指向简单变量的指针变量。
《C语言》(第五版)一课一练 第32练
8.1-8.2 指针概念、指向简单变量的指针变量
一、单选题
1. 以下关于C语言指针的叙述中,正确的是( )
A. 指针变量中存储的是另一个变量的内存地址
B. 指针变量中存储的是另一个变量的值
C. 指针变量本身没有地址
D. 所有类型的指针变量占用不同的字节数
【答案】A
【解析】指针变量是一种特殊的变量,其存储的内容是另一个变量的内存地址。B错误,指针存储的是地址而非值。C错误,指针变量本身也是变量,有自己的内存地址。D错误,在同一系统中所有指针变量占用的字节数相同(与地址总线宽度有关),与指向的类型无关。
2. 设有定义 int a=5, *p=&a; 则以下表达式中,值为5的是( )
A. p
B. &a
C. *p
D. &p
【答案】C
【解析】*p是间接访问运算,通过指针p中存储的地址访问所指向的变量a,得到a的值5。A中p存储的是a的地址,不是5。B中&a是取a的地址。D中&p是取指针变量p自身的地址。*和&是一对互逆运算:*&a等价于a,&*p等价于p。
3. 以下能正确定义指针变量p并使其指向整型变量a的是( )
A. int a=3, p=&a;
B. int a=3, *p=a;
C. int *p=&a, a=3;
D. int a=3, *p=&a;
【答案】D
【解析】D中*p=&a在定义指针p的同时用a的地址初始化,正确。A中p没有*号,p是整型变量而非指针,不能存储地址。B中*p=a将a的值3赋给p,但p应该存储地址而不是整数3。C中变量a在使用前未定义,定义顺序错误(a应先定义再使用)。
4. 设有定义 int a=10, b=20, *p=&a; 执行 *p=b; 后,以下叙述正确的是( )
A. a和b的值都变为20
B. p指向了变量b
C. a的值变为20,b的值不变
D. a的值不变,仍为10
【答案】C
【解析】*p=b通过指针p间接修改p所指向的变量a的值,将a改为20。此时a=20,b=20。但b的值是原来的20,并未被修改。p仍然指向a,没有改变指向。若要p指向b,应写p=&b而不是*p=b。
5. 设有定义 int x=100, *p1=&x, **p2=&p1; 则**p2的值是( )
A. 100
B. x的地址
C. p1的地址
D. 不确定
【答案】A
【解析】p1是一级指针,存储x的地址,*p1访问x的值100。p2是二级指针(指向指针的指针),存储p1的地址。*p2访问p1的内容(即x的地址),**p2= *(*p2)先得到p1的内容(x的地址),再间接访问得到x的值100。
6. 以下选项中,存在语法错误的是( )
A. int a=1; int *p=&a; float *q=NULL;
B. int a=1; int *p=&a; int **q=&p;
C. int a=1; int *p; p=&a;
D. int a=1; float *p=&a;
【答案】D
【解析】D中将整型变量a的地址赋给浮点型指针p,类型不匹配,int*与float*是不同的指针类型,不能直接赋值。A中p指向int、q指向float各自正确,NULL可以赋给任何指针类型。B中二级指针q存储一级指针p的地址,类型匹配。C中先定义指针p再赋值,分两步完成,语法正确。
7. 设有定义 int a=3, *p=&a, b; 执行 b=(*p)++; 后,a和b的值分别是( )
A. a=3, b=3
B. a=4, b=3
C. a=4, b=4
D. a=3, b=4
【答案】B
【解析】(*p)++先取*p的值(即a的值3)赋给b,然后a自增为4。注意(*p)++与*p++的区别:(*p)++是对p指向的变量做后置++,*p++是先取*p的值然后p本身++。b得到的是自增前的值3,a自增后变为4。
二、简答题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
main()
{
int a = 10, b = 20;
int *p1 = &a, *p2 = &b;
*p1 = *p1 + *p2;
*p2 = *p1 - *p2;
*p1 = *p1 - *p2;
printf("a=%d, b=%d
", a, b);
printf("*p1=%d, *p2=%d
", *p1, *p2);
}
【答案】a=20, b=10
*p1=20, *p2=10
【解析】程序通过指针实现a和b的交换。初始*p1=10,*p2=20。*p1=*p1+*p2=10+20=30,此时a=30。*p2=*p1-*p2=30-20=10,此时b=10。*p1=*p1-*p2=30-10=20,此时a=20。最终a=20,b=10,完成了交换。*p1和*p2分别与a和b的值相同。
三、案例分析题
9. 以下程序的功能是通过指针变量输入两个整数,并按从大到小的顺序输出。请填空。
#include <stdio.h>
main()
{
int a, b;
int *p1 = 【1】, *p2 = &b;
int *t;
printf("请输入两个整数:");
scanf("%d%d", p1, p2);
if (*p1 < *p2)
{
t = p1;
p1 = p2;
【2】;
}
printf("%d %d
", 【3】);
}
【答案】【1】&a
【2】p2=t
【3】*p1,*p2
【解析】【1】p1应指向变量a,初始化为&a。【2】交换指针p1和p2的指向,使p1指向较大值,三步交换:t=p1,p1=p2,p2=t。【3】输出时应对指针解引用,*p1输出较大值,*p2输出较小值。注意这里是交换指针的指向,而不是交换变量的值。
四、综合应用题
10. 编写一个C程序:定义一个函数swap,使用指针参数实现两个整型变量的值交换。在main函数中定义两个整型变量并初始化,调用swap函数交换它们的值,输出交换前后的结果。
【答案】#include <stdio.h>
void swap(int *p1, int *p2)
{
int t;
t = *p1;
*p1 = *p2;
*p2 = t;
}
main()
{
int a = 3, b = 5;
printf("交换前:a=%d, b=%d
", a, b);
swap(&a, &b);
printf("交换后:a=%d, b=%d
", a, b);
}
【解析】swap函数接收两个指针参数,通过间接访问修改main函数中的变量a和b。调用swap(&a,&b)传递a和b的地址,函数内通过*p1和*p2间接操作a和b实现交换。如果swap使用值传递(不用指针),函数内交换不会影响实参,这就是指针作为函数参数的核心价值。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《C语言》(第五版)《一课一练》第32练,内容是8.1-8.2 指针概念、指向简单变量的指针变量。
《C语言》(第五版)一课一练 第32练
8.1-8.2 指针概念、指向简单变量的指针变量
一、单选题
1. 以下关于C语言指针的叙述中,正确的是( )
A. 指针变量中存储的是另一个变量的内存地址
B. 指针变量中存储的是另一个变量的值
C. 指针变量本身没有地址
D. 所有类型的指针变量占用不同的字节数
2. 设有定义 int a=5, *p=&a; 则以下表达式中,值为5的是( )
A. p
B. &a
C. *p
D. &p
3. 以下能正确定义指针变量p并使其指向整型变量a的是( )
A. int a=3, p=&a;
B. int a=3, *p=a;
C. int *p=&a, a=3;
D. int a=3, *p=&a;
4. 设有定义 int a=10, b=20, *p=&a; 执行 *p=b; 后,以下叙述正确的是( )
A. a和b的值都变为20
B. p指向了变量b
C. a的值变为20,b的值不变
D. a的值不变,仍为10
5. 设有定义 int x=100, *p1=&x, **p2=&p1; 则**p2的值是( )
A. 100
B. x的地址
C. p1的地址
D. 不确定
6. 以下选项中,存在语法错误的是( )
A. int a=1; int *p=&a; float *q=NULL;
B. int a=1; int *p=&a; int **q=&p;
C. int a=1; int *p; p=&a;
D. int a=1; float *p=&a;
7. 设有定义 int a=3, *p=&a, b; 执行 b=(*p)++; 后,a和b的值分别是( )
A. a=3, b=3
B. a=4, b=3
C. a=4, b=4
D. a=3, b=4
二、简答题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
main()
{
int a = 10, b = 20;
int *p1 = &a, *p2 = &b;
*p1 = *p1 + *p2;
*p2 = *p1 - *p2;
*p1 = *p1 - *p2;
printf("a=%d, b=%d
", a, b);
printf("*p1=%d, *p2=%d
", *p1, *p2);
}
三、案例分析题
9. 以下程序的功能是通过指针变量输入两个整数,并按从大到小的顺序输出。请填空。
#include <stdio.h>
main()
{
int a, b;
int *p1 = 【1】, *p2 = &b;
int *t;
printf("请输入两个整数:");
scanf("%d%d", p1, p2);
if (*p1 < *p2)
{
t = p1;
p1 = p2;
【2】;
}
printf("%d %d
", 【3】);
}
四、综合应用题
10. 编写一个C程序:定义一个函数swap,使用指针参数实现两个整型变量的值交换。在main函数中定义两个整型变量并初始化,调用swap函数交换它们的值,输出交换前后的结果。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$