第29练 8.3 指向数组的指针变量 《编程语言基础——C语言》 (第5版) 一课一练 (湖南)

2026-06-25
| 2份
| 9页
| 41人阅读
| 0人下载

内容正文:

【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。 本卷是《编程语言基础——C语言》(第5版)《一课一练》第29练,内容是8.3 指向数组的指针变量。 《编程语言基础——C语言》(第5版)一课一练 第29练 8.3 指向数组的指针变量 一、单选题 1. 已定义 int a[5] = {1, 2, 3, 4, 5}; int *p = a; 下列说法正确的是( ) A. 数组名a代表数组首元素的地址,p指向a[0] B. a是一个指针变量,可以执行a++操作 C. p和a的值相等,且都可以被赋值修改 D. *(p+1)和*a的值相同 2. int a[] = {10, 20, 30, 40}; int *p = a; 执行 p = p + 2; 后,*p的值是( ) A. 10 B. 30 C. 20 D. a的地址值 3. 以下程序段中,能正确遍历数组a所有元素并输出的代码片段是( ) A. for (p=a; p<a+5; p++) printf("%d", *a); B. for (p=a; *p<5; p++) printf("%d", *p); C. for (p=a; p<a+5; p++) printf("%d", *p); D. for (p=a; p<5; p++) printf("%d", *p); 4. 已定义 int a[3][4]; 假设a[0][0]的地址为1000,int占4字节,则a+1的值(地址)是( ) A. 1004(a[0][0]地址+4) B. 1001 C. 1012(a[0][0]地址+12) D. 1016(a[0][0]地址+16) 5. int a[] = {2, 4, 6, 8, 10}; int *p = a + 1; 则表达式 *(p + 2) 的值是( ) A. 8 B. 6 C. 4 D. 10 6. 已定义 int a[5] = {1, 3, 5, 7, 9}; int *p = a; 以下选项中与 a[2] 不等价的是( ) A. *(a + 2) B. *p + 2 C. p[2] D. *(p + 2) 7. 已定义 int a[2][3] = {{1,2,3},{4,5,6}}; int *p = a[0]; 则*(p+4)的值是( ) A. 2 B. 4 C. 5 D. 6 二、程序运行结果题 8. 以下程序的运行结果是【··】。 #include <stdio.h> main() { int a[5] = {1, 3, 5, 7, 9}, *p, sum = 0; for (p = a; p < a + 5; p++) if (*p % 3 == 0) sum += *p; printf("%d", sum); } 三、程序填空题 9. 以下程序的功能是:用指针逆序输出数组元素。请填空。 #include <stdio.h> main() { int a[5] = {10, 20, 30, 40, 50}, *p; for (p = a + 4; 【1】; p--) printf("%d ", *p); } 四、阅读程序改错题 10. 阅读以下程序,该程序的功能是用指针访问二维数组的元素并输出。程序中有1处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。 L1 #include <stdio.h> L2 main() L3 { L4 int a[2][3] = {{1,2,3},{4,5,6}}; L5 int *p = a; L6 printf("%d ", *(p + 4)); L7 } 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 学科网(北京)股份有限公司 $ 【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。 本卷是《编程语言基础——C语言》(第5版)《一课一练》第29练,内容是8.3 指向数组的指针变量。 《编程语言基础——C语言》(第5版)一课一练 第29练 8.3 指向数组的指针变量 一、单选题 1. 已定义 int a[5] = {1, 2, 3, 4, 5}; int *p = a; 下列说法正确的是( ) A. 数组名a代表数组首元素的地址,p指向a[0] B. a是一个指针变量,可以执行a++操作 C. p和a的值相等,且都可以被赋值修改 D. *(p+1)和*a的值相同 【答案】A 【解析】数组名a是地址常量(代表数组首地址),可以赋给指针变量p。但a本身不能被修改(不能a++),而p是变量可以p++。p指向a[0],*(p+1)等价于a[1]即2,*a等价于a[0]即1。 2. int a[] = {10, 20, 30, 40}; int *p = a; 执行 p = p + 2; 后,*p的值是( ) A. 10 B. 30 C. 20 D. a的地址值 【答案】B 【解析】p初始指向a[0]。p+2使指针向后移动2个int型元素的位置(即移动2*sizeof(int)字节),p指向a[2],因此*p=30。指针的加减运算是以所指向类型的大小为单位的。 3. 以下程序段中,能正确遍历数组a所有元素并输出的代码片段是( ) A. for (p=a; p<a+5; p++) printf("%d", *a); B. for (p=a; *p<5; p++) printf("%d", *p); C. for (p=a; p<a+5; p++) printf("%d", *p); D. for (p=a; p<5; p++) printf("%d", *p); 【答案】C 【解析】C中p从a(首地址)开始,每次p++移到下一个元素,p<a+5作为循环条件(比较地址),每次输出*p即当前元素的值。A始终输出*a(a[0]);B用*p的值<5作为条件(逻辑错误);D将指针p与整数5比较(类型不匹配)。 4. 已定义 int a[3][4]; 假设a[0][0]的地址为1000,int占4字节,则a+1的值(地址)是( ) A. 1004(a[0][0]地址+4) B. 1001 C. 1012(a[0][0]地址+12) D. 1016(a[0][0]地址+16) 【答案】D 【解析】对于二维数组a[3][4],a代表第0行的行指针。a+1中的1表示移动一整行,即4个int元素(4*4=16字节)。因此a+1的地址为1000+16=1016,指向第1行的首地址。 5. int a[] = {2, 4, 6, 8, 10}; int *p = a + 1; 则表达式 *(p + 2) 的值是( ) A. 8 B. 6 C. 4 D. 10 【答案】A 【解析】p=a+1指向a[1]=4。p+2从p当前指向的位置再向后移2个元素,即指向a[3]=8。因此*(p+2)=8。注意:p的运算始终以当前p的值为基准。 6. 已定义 int a[5] = {1, 3, 5, 7, 9}; int *p = a; 以下选项中与 a[2] 不等价的是( ) A. *(a + 2) B. *p + 2 C. p[2] D. *(p + 2) 【答案】B 【解析】a[2]=5。等价形式有:*(a+2)=5,p[2]=5(指针也可用下标),*(p+2)=5。*p+2等价于a[0]+2=1+2=3,不等价。注意指针也可以像数组名一样使用[]运算符。 7. 已定义 int a[2][3] = {{1,2,3},{4,5,6}}; int *p = a[0]; 则*(p+4)的值是( ) A. 2 B. 4 C. 5 D. 6 【答案】C 【解析】a[0]是第0行首元素的地址(即&a[0][0]),类型为int*。p=a[0]指向a[0][0]=1。p+4向后移动4个int元素:p指向a[0][0](1)→a[0][1](2)→a[0][2](3)→a[1][0](4)→a[1][1](5)。二维数组在内存中是按行连续存储的。 二、程序运行结果题 8. 以下程序的运行结果是【··】。 #include <stdio.h> main() { int a[5] = {1, 3, 5, 7, 9}, *p, sum = 0; for (p = a; p < a + 5; p++) if (*p % 3 == 0) sum += *p; printf("%d", sum); } 【答案】12 【解析】程序通过指针p遍历数组a,累加能被3整除的元素。a[0]=1(不被3整除)→a[1]=3(整除,sum=3)→a[2]=5(不)→a[3]=7(不)→a[4]=9(整除,sum=12)。最终输出12。 三、程序填空题 9. 以下程序的功能是:用指针逆序输出数组元素。请填空。 #include <stdio.h> main() { int a[5] = {10, 20, 30, 40, 50}, *p; for (p = a + 4; 【1】; p--) printf("%d ", *p); } 【答案】【1】p >= a 【解析】逆序输出需要p从最后一个元素a+4开始,每次p--向前移动,直到p越过了首元素a[0]为止。循环条件p>=a确保当p指回a[0]后还会输出a[0],然后p--后p<a时终止。 四、阅读程序改错题 10. 阅读以下程序,该程序的功能是用指针访问二维数组的元素并输出。程序中有1处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。 L1 #include <stdio.h> L2 main() L3 { L4 int a[2][3] = {{1,2,3},{4,5,6}}; L5 int *p = a; L6 printf("%d ", *(p + 4)); L7 } 【答案】【1】L5: int *p = a; → 应改为 int *p = a[0]; (也可以 int *p = &a[0][0];,a是行指针类型int(*)[3],不能直接赋给int*,应使用a[0]获取首元素地址) 【解析】二维数组名a的类型是int(*)[3](指向含3个int的一维数组的指针),而p是int*类型,类型不匹配。要用int*指针遍历二维数组的元素,需要用a[0](即&a[0][0])来获取首元素的地址。 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 学科网(北京)股份有限公司 $

资源预览图

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