内容正文:
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《C语言》(第五版)《一课一练》第36练,内容是第8章 指针综合。
《C语言》(第五版)一课一练 第36练
第8章 指针综合
一、单选题
1. 设有定义 int a=5, *p=&a; 则以下表达式中,能使a的值增加1的是( )
A. (*p)++;
B. *p++;
C. &a++;
D. p++;
2. 设有定义 int a[5]={3,6,9,12,15}, *p=a+1; 则p[2]的值是( )
A. 9
B. 15
C. 6
D. 12
3. 以下程序片段的输出结果是
char *s = "ABCDE";
char *p = s + 2;
printf("%s", p);( )
A. ABCDE
B. CDE
C. CD
D. B
4. 以下程序片段的输出结果是
void add(int *a, int b)
{
*a += b;
b *= 2;
}
main()
{
int x = 10, y = 3;
add(&x, y);
printf("%d %d", x, y);
}( )
A. 13 3
B. 13 6
C. 10 3
D. 10 6
5. 设有定义 struct Stu { int num; float score; } s[3]={{101,80},{102,90},{103,70}}, *p=s; 则以下表达式值最大的是( )
A. (p+2)->score
B. p->score
C. (++p)->score
D. p[1].score
6. 设有定义 int a=1, b=2, c=3, *p[3]={&a,&b,&c}; 则*p[1]的值是( )
A. 1
B. 3
C. &b的地址
D. 2
7. 以下程序片段的输出结果是
int a[4] = {1, 2, 3, 4};
int *p = a;
int sum = 0;
for (int i = 0; i < 4; i++)
sum += *(p + i);
p = a + 3;
sum += *p;
printf("%d", sum);( )
A. 10
B. 11
C. 14
D. 18
二、简答题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
void swap(int *p1, int *p2)
{
int t;
t = *p1;
*p1 = *p2;
*p2 = t;
}
main()
{
int a[5] = {5, 3, 1, 4, 2};
int i, j;
for (i = 0; i < 4; i++)
for (j = 0; j < 4 - i; j++)
if (a[j] > a[j + 1])
swap(&a[j], &a[j + 1]);
for (i = 0; i < 5; i++)
printf("%d ", a[i]);
}
三、案例分析题
9. 以下程序的功能是使用指针实现字符串的逆序存放。请填空。
#include <stdio.h>
#include <string.h>
void reverse(char *s)
{
char *p = s, *q = s + strlen(s) - 1, t;
while (【1】)
{
t = *p;
【2】;
*q = t;
p++;
【3】;
}
}
main()
{
char str[80] = "Hello World";
reverse(str);
printf("%s
", str);
}
四、综合应用题
10. 编写一个C程序:使用指针实现选择排序,对包含8个整数的一维数组进行升序排列。要求:(1)定义函数selectSort,参数为整型指针和元素个数,函数内使用指针操作完成排序;(2)在main函数中定义数组并初始化,调用排序函数后输出排序结果。全程不使用下标访问数组元素。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《C语言》(第五版)《一课一练》第36练,内容是第8章 指针综合。
《C语言》(第五版)一课一练 第36练
第8章 指针综合
一、单选题
1. 设有定义 int a=5, *p=&a; 则以下表达式中,能使a的值增加1的是( )
A. (*p)++;
B. *p++;
C. &a++;
D. p++;
【答案】A
【解析】(*p)++先解引用p得到a的值5,然后对a做后置自增,a变为6。B中*p++由于++优先级高于*,等价于*(p++),p先指向a取值5,然后p本身后移(指向未知地址),a不变。C中&a取地址是右值不能自增。D中p++使指针后移,不改变a的值。
2. 设有定义 int a[5]={3,6,9,12,15}, *p=a+1; 则p[2]的值是( )
A. 9
B. 15
C. 6
D. 12
【答案】D
【解析】p=a+1使p指向a[1],p[2]等价于*(p+2),即a[1+2]=a[3]=12。指针带下标的访问方式p[i]等价于*(p+i)。A是p[1]即a[2]=9。B是p[3]即a[4]=15。C是p[0]即a[1]=6。
3. 以下程序片段的输出结果是
char *s = "ABCDE";
char *p = s + 2;
printf("%s", p);( )
A. ABCDE
B. CDE
C. CD
D. B
【答案】B
【解析】s指向字符串"ABCDE"的首字符'A',s+2指向第3个字符'C'。printf("%s",p)从p指向的位置开始输出直到遇到'\0',因此输出"CDE"。%s输出从给定地址到'\0'之间的全部字符。
4. 以下程序片段的输出结果是
void add(int *a, int b)
{
*a += b;
b *= 2;
}
main()
{
int x = 10, y = 3;
add(&x, y);
printf("%d %d", x, y);
}( )
A. 13 3
B. 13 6
C. 10 3
D. 10 6
【答案】A
【解析】调用add(&x,y)时,a接收x的地址,b接收y的值3。*a+=b即x=10+3=13。b*=2修改的是形参b为6,不影响实参y。因此x=13,y=3。指针参数可以修改实参,值参数的修改不影响实参。
5. 设有定义 struct Stu { int num; float score; } s[3]={{101,80},{102,90},{103,70}}, *p=s; 则以下表达式值最大的是( )
A. (p+2)->score
B. p->score
C. (++p)->score
D. p[1].score
【答案】C
【解析】初始p=s指向s[0]。A中(p+2)->score=s[2].score=70。B中p->score=s[0].score=80。C中(++p)先使p指向s[1],再取s[1].score=90。D中p[1].score此时p已指向s[1],p[1]即s[2].score=70。比较各值:A=70,B=80,C=90,D=70,C最大。
6. 设有定义 int a=1, b=2, c=3, *p[3]={&a,&b,&c}; 则*p[1]的值是( )
A. 1
B. 3
C. &b的地址
D. 2
【答案】D
【解析】int *p[3]是包含3个整型指针的数组(指针数组)。p[0]=&a,p[1]=&b,p[2]=&c。*p[1]等价于*(p[1]),即解引用p[1]得到b的值2。A是*p[0]的值。B是*p[2]的值。C是p[1]的值而非*p[1]。
7. 以下程序片段的输出结果是
int a[4] = {1, 2, 3, 4};
int *p = a;
int sum = 0;
for (int i = 0; i < 4; i++)
sum += *(p + i);
p = a + 3;
sum += *p;
printf("%d", sum);( )
A. 10
B. 11
C. 14
D. 18
【答案】C
【解析】循环中*(p+i)依次为a[0]=1,a[1]=2,a[2]=3,a[3]=4,sum=1+2+3+4=10。然后p=a+3指向a[3],*p=4,sum=10+4=14。注意循环已经累加了所有元素,p重新指向a[3]后又加了一次a[3]的值4。
二、简答题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
void swap(int *p1, int *p2)
{
int t;
t = *p1;
*p1 = *p2;
*p2 = t;
}
main()
{
int a[5] = {5, 3, 1, 4, 2};
int i, j;
for (i = 0; i < 4; i++)
for (j = 0; j < 4 - i; j++)
if (a[j] > a[j + 1])
swap(&a[j], &a[j + 1]);
for (i = 0; i < 5; i++)
printf("%d ", a[i]);
}
【答案】1 2 3 4 5
【解析】程序使用冒泡排序对数组a进行升序排列,通过swap函数交换相邻元素。初始{5,3,1,4,2},第一轮:交换5和3得{3,5,1,4,2},交换5和1得{3,1,5,4,2},交换5和4得{3,1,4,5,2},交换5和2得{3,1,4,2,5}。继续排序最终得到{1,2,3,4,5}。swap函数通过指针参数实现真正的元素交换。
三、案例分析题
9. 以下程序的功能是使用指针实现字符串的逆序存放。请填空。
#include <stdio.h>
#include <string.h>
void reverse(char *s)
{
char *p = s, *q = s + strlen(s) - 1, t;
while (【1】)
{
t = *p;
【2】;
*q = t;
p++;
【3】;
}
}
main()
{
char str[80] = "Hello World";
reverse(str);
printf("%s
", str);
}
【答案】【1】p<q
【2】*p=*q
【3】q--
【解析】【1】双指针法逆序,p从左端q从右端,当p<q时继续交换。【2】交换*p和*q的值:先保存*p到t,然后*p=*q将q指向的字符赋给p指向的位置。【3】交换后q前移,即q--。每次交换后两端指针向中间靠拢,直到相遇完成逆序。
四、综合应用题
10. 编写一个C程序:使用指针实现选择排序,对包含8个整数的一维数组进行升序排列。要求:(1)定义函数selectSort,参数为整型指针和元素个数,函数内使用指针操作完成排序;(2)在main函数中定义数组并初始化,调用排序函数后输出排序结果。全程不使用下标访问数组元素。
【答案】#include <stdio.h>
void selectSort(int *a, int n)
{
int *p, *q, *minp, t;
for (p = a; p < a + n - 1; p++)
{
minp = p;
for (q = p + 1; q < a + n; q++)
if (*q < *minp)
minp = q;
if (minp != p)
{
t = *p;
*p = *minp;
*minp = t;
}
}
}
main()
{
int a[8] = {49, 38, 65, 97, 76, 13, 27, 49};
int *p;
selectSort(a, 8);
for (p = a; p < a + 8; p++)
printf("%d ", *p);
printf("
");
}
【解析】selectSort函数使用选择排序算法,全程通过指针操作数组。外层循环指针p从首元素到倒数第二个元素,内层循环指针q从p的下一个元素到末尾,找出最小值的位置minp。交换*p和*minp完成一趟选择。main中传入数组名a作为指针参数,排序后用指针遍历输出。整个程序未使用任何下标运算。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$