内容正文:
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《编程语言基础——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])来获取首元素的地址。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$