内容正文:
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《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个整数)的逆序存放。要求:原数组从键盘输入,逆序后输出结果。不得使用下标法,全部使用指针操作。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$