第33练 8.3 指向一维数组和多维数组的指针变量 《C语言》 (第五版) 一课一练 (山东省)

2026-06-24
| 2份
| 10页
| 2人阅读
| 0人下载

资源信息

学段 中职
学科 职教专业课
课程 C语言程序设计
教材版本 -
年级 -
章节 -
类型 作业-同步练
知识点 C语言概述
使用场景 同步教学
学年 2026-2027
地区(省份) 山东省
地区(市) -
地区(区县) -
文件格式 ZIP
文件大小 107 KB
发布时间 2026-06-24
更新时间 2026-06-24
作者 xkw_068401954
品牌系列 上好课·一课一练
审核时间 2026-06-24
下载链接 https://m.zxxk.com/soft/58480048.html
价格 1.00储值(1储值=1元)
来源 学科网

内容正文:

【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。 本卷是《C语言》(第五版)《一课一练》第33练,内容是8.3 指向一维数组和多维数组的指针变量。 《C语言》(第五版)一课一练 第33练 8.3 指向一维数组和多维数组的指针变量 一、单选题 1. 以下关于数组名与指针关系的叙述中,正确的是( ) A. 数组名是变量,可以对数组名进行赋值操作 B. 数组名代表整个数组的值 C. 数组名代表数组首元素的地址,是地址常量不能被赋值 D. 数组名与指针变量完全相同,没有区别 【答案】C 【解析】数组名代表数组首元素的地址,是一个地址常量,不能对其进行自增、赋值等操作。A错误,数组名不是变量,不能写a++、a=p这样的语句。B错误,数组名不是整个数组的值,而是首元素地址。D错误,数组名是常量不能修改,指针变量可以修改指向。 2. 设有定义 int a[5]={10,20,30,40,50}, *p=a; 则*p的值是( ) A. 20 B. a[0]的地址 C. a的地址 D. 10 【答案】D 【解析】p=a使指针p指向数组a的首元素a[0],*p间接访问p所指向的元素,即a[0]的值10。A是*(p+1)的值。B是p本身的值,不是*p。C是&a(即a本身)的值,不是*p的值。*p等价于a[0]。 3. 设有定义 int a[5]={10,20,30,40,50}, *p=a+2; 则*(p+1)的值是( ) A. 30 B. 20 C. 40 D. 50 【答案】C 【解析】p=a+2使p指向a[2](值为30)。p+1指向a[3](值为40),*(p+1)即a[3]的值40。指针加1不是地址加1字节,而是移动一个元素的位置,对于int型指针移动4字节。A是*p的值30。B是*(p-1)的值20。D是*(p+2)的值。 4. 以下程序片段的输出结果是 int a[]={2,4,6,8,10}, *p; for(p=a; p<a+5; p++) printf("%d ", *p);( ) A. 2 4 6 8 10 B. 2 4 6 8 C. 4 6 8 10 D. 1 2 3 4 5 【答案】A 【解析】指针p从a开始(指向a[0]),每次循环p++移动到下一个元素,直到p>=a+5时停止。依次输出*p即a[0]=2,a[1]=4,a[2]=6,a[3]=8,a[4]=10。这是用指针遍历数组的标准方式,p<a+5确保遍历全部5个元素。 5. 设有定义 int a[5]={1,2,3,4,5}, *p=a; 则以下能正确访问a[3]的是( ) A. *p+3 B. *(a+3)与p[3]都能访问a[3] C. &a[3] D. *(p+3) 【答案】D 【解析】*(p+3)通过指针运算访问p+3指向的元素即a[3],正确。A中*p+3是先取*p的值1加3得4,不是a[3]。B中*(a+3)和p[3]都可访问a[3],但B选项描述上有歧义。D是明确正确的单个表达式,是最准确的答案。C中&a[3]是a[3]的地址而非值。 6. 设有定义 int a[2][3]={{1,2,3},{4,5,6}}; 则以下能正确表示元素a[1][2]的地址的是( ) A. a+1+2 B. a[1]+2 C. &a[1][2]与*(a+1)+2 D. a[1][2] 【答案】B 【解析】a[1]是第1行首元素a[1][0]的地址(类型int*),a[1]+2就是a[1][2]的地址。A中a+1是第1行的地址(类型int(*)[3]),a+1+2是第3行的地址,越界了。C中&a[1][2]和*(a+1)+2两个表达式都正确表示a[1][2]的地址,但选项B是最简洁准确的答案。D中a[1][2]是元素值,不是地址值。 7. 设有定义 int a[3][4]; 则以下能正确定义指向二维数组a的行的指针的是( ) A. int (*p)[4]; B. int *p[4]; C. int **p; D. int (*p)(); 【答案】A 【解析】int (*p)[4]定义了一个行指针(数组指针),p指向含有4个int元素的一维数组,与a的行类型匹配。B中int *p[4]是包含4个整型指针的指针数组,圆括号的有无改变了结合性。C中int **p是二级指针,不匹配二维数组。D中int (*p)()是函数指针,与数组无关。 二、简答题 8. 以下程序的运行结果是【··】。 #include <stdio.h> main() { int a[5] = {10, 20, 30, 40, 50}; int *p = a, *q = a + 4; while (p < q) { int t = *p; *p = *q; *q = t; p++; q--; } for (int i = 0; i < 5; i++) printf("%d ", a[i]); } 【答案】50 40 30 20 10 【解析】程序使用双指针法将数组逆序。p指向a[0],q指向a[4]。第一轮交换a[0]和a[4]得{50,20,30,40,10},p++指向a[1],q--指向a[3]。第二轮交换a[1]和a[3]得{50,40,30,20,10},p++指向a[2],q--指向a[2],此时p==q循环结束。数组逆序为50 40 30 20 10。 三、案例分析题 9. 以下程序的功能是使用指针求数组中最大值和最小值。请填空。 #include <stdio.h> main() { int a[5] = {34, 12, 56, 78, 23}; int *p, *max, *min; max = min = 【1】; for (p = a; p < a + 5; p++) { if (*p > *max) 【2】; if (*p < *min) min = p; } printf("最大值:%d ", 【3】); printf("最小值:%d ", *min); } 【答案】【1】a 【2】max=p 【3】*max 【解析】【1】max和min初始都应指向数组首元素a[0],即a(首元素地址)。【2】当*p>*max时,应更新max指针指向当前元素,即max=p。【3】输出最大值需要对max解引用,即*max。程序使用三个指针遍历数组,max和min分别记录最大值和最小值的地址。 四、综合应用题 10. 编写一个C程序:使用指针实现一维数组(含10个整数)的逆序存放。要求:原数组从键盘输入,逆序后输出结果。不得使用下标法,全部使用指针操作。 【答案】#include <stdio.h> main() { int a[10], *p, *q, t; printf("请输入10个整数:"); for (p = a; p < a + 10; p++) scanf("%d", p); p = a; q = a + 9; while (p < q) { t = *p; *p = *q; *q = t; p++; q--; } for (p = a; p < a + 10; p++) printf("%d ", *p); printf(" "); } 【解析】程序使用双指针法实现数组逆序。p指向首元素,q指向末元素,交换两者后p后移q前移,直到p>=q。输入时用指针p接收scanf。逆序操作全程使用指针间接访问,未使用下标。输出时同样通过指针遍历数组。 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 学科网(北京)股份有限公司 $ 【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。 本卷是《C语言》(第五版)《一课一练》第33练,内容是8.3 指向一维数组和多维数组的指针变量。 《C语言》(第五版)一课一练 第33练 8.3 指向一维数组和多维数组的指针变量 一、单选题 1. 以下关于数组名与指针关系的叙述中,正确的是( ) A. 数组名是变量,可以对数组名进行赋值操作 B. 数组名代表整个数组的值 C. 数组名代表数组首元素的地址,是地址常量不能被赋值 D. 数组名与指针变量完全相同,没有区别 2. 设有定义 int a[5]={10,20,30,40,50}, *p=a; 则*p的值是( ) A. 20 B. a[0]的地址 C. a的地址 D. 10 3. 设有定义 int a[5]={10,20,30,40,50}, *p=a+2; 则*(p+1)的值是( ) A. 30 B. 20 C. 40 D. 50 4. 以下程序片段的输出结果是 int a[]={2,4,6,8,10}, *p; for(p=a; p<a+5; p++) printf("%d ", *p);( ) A. 2 4 6 8 10 B. 2 4 6 8 C. 4 6 8 10 D. 1 2 3 4 5 5. 设有定义 int a[5]={1,2,3,4,5}, *p=a; 则以下能正确访问a[3]的是( ) A. *p+3 B. *(a+3)与p[3]都能访问a[3] C. &a[3] D. *(p+3) 6. 设有定义 int a[2][3]={{1,2,3},{4,5,6}}; 则以下能正确表示元素a[1][2]的地址的是( ) A. a+1+2 B. a[1]+2 C. &a[1][2]与*(a+1)+2 D. a[1][2] 7. 设有定义 int a[3][4]; 则以下能正确定义指向二维数组a的行的指针的是( ) A. int (*p)[4]; B. int *p[4]; C. int **p; D. int (*p)(); 二、简答题 8. 以下程序的运行结果是【··】。 #include <stdio.h> main() { int a[5] = {10, 20, 30, 40, 50}; int *p = a, *q = a + 4; while (p < q) { int t = *p; *p = *q; *q = t; p++; q--; } for (int i = 0; i < 5; i++) printf("%d ", a[i]); } 三、案例分析题 9. 以下程序的功能是使用指针求数组中最大值和最小值。请填空。 #include <stdio.h> main() { int a[5] = {34, 12, 56, 78, 23}; int *p, *max, *min; max = min = 【1】; for (p = a; p < a + 5; p++) { if (*p > *max) 【2】; if (*p < *min) min = p; } printf("最大值:%d ", 【3】); printf("最小值:%d ", *min); } 四、综合应用题 10. 编写一个C程序:使用指针实现一维数组(含10个整数)的逆序存放。要求:原数组从键盘输入,逆序后输出结果。不得使用下标法,全部使用指针操作。 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 学科网(北京)股份有限公司 $

资源预览图

第33练 8.3 指向一维数组和多维数组的指针变量 《C语言》 (第五版) 一课一练 (山东省)
1
第33练 8.3 指向一维数组和多维数组的指针变量 《C语言》 (第五版) 一课一练 (山东省)
2
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。