内容正文:
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《编程语言基础——C语言》(第5版)《一课一练》第30练,内容是8.4 指向字符串的指针变量。
《编程语言基础——C语言》(第5版)一课一练 第30练
8.4 指向字符串的指针变量
一、单选题
1. 以下关于字符指针的说法,正确的是( )
A. char *p = "Hello"; 定义了一个字符指针p,它指向字符串常量"Hello"的首字符
B. char *p = "Hello"; 将整个字符串"Hello"存入指针变量p中
C. 字符指针不能用来遍历字符串
D. char *p = "Hello"; 与 char s[] = "Hello"; 含义完全相同
【答案】A
【解析】char *p="Hello"定义指针p,指向字符串常量在内存中的首地址。p中存放的是一个地址值,而非整个字符串。与char s[]="Hello"不同,后者是字符数组,在栈上分配空间并复制字符串内容。
2. 比较 char s[] = "ABC"; 与 char *p = "ABC"; 以下说法正确的是( )
A. s和p都可以通过 s = "XYZ"; 的方式重新赋值
B. p可以通过 p = "XYZ"; 改变指向,但s不能通过 s = "XYZ"; 改变
C. s和p占用的内存大小完全相同
D. s中的内容不能被修改,p指向的内容可以被修改
【答案】B
【解析】s是数组名,是地址常量,不能改变其指向;p是指针变量,可以指向其他字符串。但p指向的是字符串常量(不可修改的内存区域),不能通过p修改内容;s是在栈上的数组,可以修改元素。
3. char *p = "Hello"; 以下能正确输出字符串中每个字符的代码段是( )
A. while (*p) printf("%c", p++);
B. while (p) printf("%c", *p++);
C. while (*p) printf("%c", *p++);
D. while (p != '\0') printf("%c", *p++);
【答案】C
【解析】while(*p)判断当前字符是否为'\0'(字符串结束标志),不是则输出*p然后p++指向下一个字符。A错误:p++而非*p++;B错误:条件p判断地址而非字符值;D错误:p!='\0'比较指针与字符(类型错误)。
4. 已定义 char *week[] = {"Mon", "Tue", "Wed"}; 则表达式 *(week[1] + 1) 的值是( )
A. T
B. M
C. w
D. u
【答案】D
【解析】week是指针数组,week[1]指向"Tue"的首字符'T'。week[1]+1指向字符'u',*(week[1]+1)即'u'。等价于week[1][1]。这是字符串指针数组的典型应用。
5. 有以下代码:char *p = "ABC"; *(p + 1) = 'X'; 执行后可能的结果是( )
A. 程序运行时出错,因为试图修改字符串常量
B. p指向的字符串变为"AXC"
C. 编译错误
D. p指向的字符串变为"XBC"
【答案】A
【解析】char *p="ABC"中p指向的是字符串常量区(不可修改的内存区域),通过p修改其内容属于未定义行为,通常会导致运行时错误(段错误)。如果要修改字符串,应使用字符数组char s[]="ABC"。
6. char *p = "Programming"; 则 strlen(p + 3) 的值是( )
A. 11
B. 8
C. 3
D. 14
【答案】B
【解析】strlen(p+3)从p+3指向的字符'g'开始计算到'\0'的长度。原字符串"Programming"共11个字符(不含'\0')。p+3跳过前3个字符"Pro",剩下"gramming"共8个字符,因此strlen(p+3)=8。
7. char *p = "ABC", *q = "ABC"; 在大多数编译器中,以下判断正确的是( )
A. p和q一定指向不同的内存地址
B. p == q 的比较结果为假
C. p和q可能指向同一块内存,但用strcmp比较内容更安全
D. p和q不能使用 == 比较
【答案】C
【解析】编译器可能对相同的字符串常量进行优化,让p和q指向同一块内存(字符串池),因此p==q可能为真。但这不是语言标准保证的行为,比较字符串内容应使用strcmp函数,而非直接比较指针。
二、程序运行结果题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
main()
{
char *p = "C Language";
int count = 0;
while (*p)
{
if (*p >= 'a' && *p <= 'z')
count++;
p++;
}
printf("%d", count);
}
【答案】7
【解析】程序通过字符指针p遍历字符串"C Language",统计小写字母的个数。字符逐个判断:a,n,g,u,a,g,e共7个小写字母。C和L是大写,空格不是字母。最终count=7。
三、程序填空题
9. 以下程序的功能是:用字符指针实现字符串拷贝(将src的内容复制到dest)。请填空。
#include <stdio.h>
main()
{
char src[] = "Hello World";
char dest[20];
char *ps = src, *pd = dest;
while (*ps)
{
*pd = *ps;
pd++;
【1】;
}
*pd = '\0';
printf("dest = %s
", dest);
}
【答案】【1】ps++
【解析】字符串拷贝需要同时移动源指针ps和目标指针pd。循环体中*pd=*ps复制一个字符后,pd++和ps++分别使两个指针后移。缺少ps++会导致ps始终指向第一个字符,while(*ps)永远为真,形成死循环。
四、阅读程序改错题
10. 阅读以下程序,该程序的功能是用字符指针接收用户输入的字符串并输出。程序中有1处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。
L1 #include <stdio.h>
L2 main()
L3 {
L4 char *p;
L5 printf("请输入字符串:");
L6 scanf("%s", p);
L7 printf("您输入的是:%s
", p);
L8 }
【答案】【1】L4: char *p; → 应改为 char p[100];(指针p未初始化,没有指向合法的内存空间,scanf写入会导致程序崩溃)
【解析】字符指针p定义后未初始化(野指针),scanf("%s",p)会尝试将输入字符串写入p指向的随机地址,造成非法内存访问。应使用字符数组(如char p[100])提供合法的存储空间,再将数组名(首地址)传给scanf。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《编程语言基础——C语言》(第5版)《一课一练》第30练,内容是8.4 指向字符串的指针变量。
《编程语言基础——C语言》(第5版)一课一练 第30练
8.4 指向字符串的指针变量
一、单选题
1. 以下关于字符指针的说法,正确的是( )
A. char *p = "Hello"; 定义了一个字符指针p,它指向字符串常量"Hello"的首字符
B. char *p = "Hello"; 将整个字符串"Hello"存入指针变量p中
C. 字符指针不能用来遍历字符串
D. char *p = "Hello"; 与 char s[] = "Hello"; 含义完全相同
2. 比较 char s[] = "ABC"; 与 char *p = "ABC"; 以下说法正确的是( )
A. s和p都可以通过 s = "XYZ"; 的方式重新赋值
B. p可以通过 p = "XYZ"; 改变指向,但s不能通过 s = "XYZ"; 改变
C. s和p占用的内存大小完全相同
D. s中的内容不能被修改,p指向的内容可以被修改
3. char *p = "Hello"; 以下能正确输出字符串中每个字符的代码段是( )
A. while (*p) printf("%c", p++);
B. while (p) printf("%c", *p++);
C. while (*p) printf("%c", *p++);
D. while (p != '\0') printf("%c", *p++);
4. 已定义 char *week[] = {"Mon", "Tue", "Wed"}; 则表达式 *(week[1] + 1) 的值是( )
A. T
B. M
C. w
D. u
5. 有以下代码:char *p = "ABC"; *(p + 1) = 'X'; 执行后可能的结果是( )
A. 程序运行时出错,因为试图修改字符串常量
B. p指向的字符串变为"AXC"
C. 编译错误
D. p指向的字符串变为"XBC"
6. char *p = "Programming"; 则 strlen(p + 3) 的值是( )
A. 11
B. 8
C. 3
D. 14
7. char *p = "ABC", *q = "ABC"; 在大多数编译器中,以下判断正确的是( )
A. p和q一定指向不同的内存地址
B. p == q 的比较结果为假
C. p和q可能指向同一块内存,但用strcmp比较内容更安全
D. p和q不能使用 == 比较
二、程序运行结果题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
main()
{
char *p = "C Language";
int count = 0;
while (*p)
{
if (*p >= 'a' && *p <= 'z')
count++;
p++;
}
printf("%d", count);
}
三、程序填空题
9. 以下程序的功能是:用字符指针实现字符串拷贝(将src的内容复制到dest)。请填空。
#include <stdio.h>
main()
{
char src[] = "Hello World";
char dest[20];
char *ps = src, *pd = dest;
while (*ps)
{
*pd = *ps;
pd++;
【1】;
}
*pd = '\0';
printf("dest = %s
", dest);
}
四、阅读程序改错题
10. 阅读以下程序,该程序的功能是用字符指针接收用户输入的字符串并输出。程序中有1处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。
L1 #include <stdio.h>
L2 main()
L3 {
L4 char *p;
L5 printf("请输入字符串:");
L6 scanf("%s", p);
L7 printf("您输入的是:%s
", p);
L8 }
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$