内容正文:
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《C语言》(第五版)《一课一练》第34练,内容是8.4-8.5 指向字符串的指针、指针作为函数参数。
《C语言》(第五版)一课一练 第34练
8.4-8.5 指向字符串的指针、指针作为函数参数
一、单选题
1. 以下能正确定义字符指针并指向字符串常量的是( )
A. char *p = 'Hello';
B. char p = "Hello";
C. char *p; *p = "Hello";
D. char *p = "Hello";
2. 以下关于字符数组和字符指针的描述中,正确的是( )
A. 字符数组和字符指针完全相同,可以互换使用
B. 字符数组名可以被重新赋值指向新字符串
C. 字符数组可以修改其中的字符内容,字符指针指向字符串常量时不能修改内容
D. 字符指针指向字符串常量时可以修改该常量的内容
3. 设有定义 char *p = "ABCDE"; 则表达式 *(p+3) 的值是( )
A. 'D'
B. 'C'
C. "D"
D. 'E'
4. 以下关于指针作为函数参数的叙述中,正确的是( )
A. 指针参数传递的是变量的值,函数内无法修改实参
B. 使用指针参数时,实参必须是常量
C. 指针参数与普通值参数效果完全相同
D. 指针参数使得函数可以修改调用者中的变量值
5. 以下程序片段的输出结果是
char s[] = "Hello";
char *p = s;
while (*p) p++;
printf("%d", p - s);( )
A. 6
B. 5
C. 4
D. 0
6. 以下代码片段中,运行时会出现错误的是( )
A. char *p = "ABC"; p[0] = 'D';
B. char s[] = "ABC"; s[0] = 'D';
C. char s[] = "ABC"; char *p = s; *p = 'D';
D. char s[] = "ABC"; char *p = s; p++;
7. 以下程序片段的输出结果是
void f(int x, int *y)
{
x = 100;
*y = 200;
}
main()
{
int a = 1, b = 2;
f(a, &b);
printf("%d %d", a, b);
}( )
A. 100 200
B. 1 2
C. 1 200
D. 100 2
二、简答题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
void copy(char *dest, char *src)
{
while (*src)
{
*dest = *src;
dest++;
src++;
}
*dest = '\0';
}
main()
{
char a[20] = "Hello", b[20];
copy(b, a);
printf("%s
", b);
printf("%d
", b[0] - 'A');
}
三、案例分析题
9. 以下程序的功能是编写函数将字符串中的小写字母转为大写字母。请填空。
#include <stdio.h>
void toUpper(【1】)
{
while (*s)
{
if (*s >= 'a' 【2】 *s <= 'z')
*s = *s 【3】 ('a' - 'A');
s++;
}
}
main()
{
char str[80];
printf("请输入字符串:");
gets(str);
toUpper(str);
printf("大写:%s
", str);
}
四、综合应用题
10. 编写一个C程序:定义函数strCat,使用指针实现字符串连接功能(不使用strcat库函数)。函数将src指向的字符串连接到dest指向的字符串末尾。在main函数中定义两个字符数组并初始化,调用strCat函数后输出连接结果。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《C语言》(第五版)《一课一练》第34练,内容是8.4-8.5 指向字符串的指针、指针作为函数参数。
《C语言》(第五版)一课一练 第34练
8.4-8.5 指向字符串的指针、指针作为函数参数
一、单选题
1. 以下能正确定义字符指针并指向字符串常量的是( )
A. char *p = 'Hello';
B. char p = "Hello";
C. char *p; *p = "Hello";
D. char *p = "Hello";
【答案】D
【解析】D中char *p="Hello"定义字符指针p并指向字符串常量"Hello"的首字符地址,正确。A中'Hello'单引号内不能有多个字符,字符串应用双引号。B中p是char类型变量,不能存储地址。C中*p="Hello"是对p指向的未知地址赋值,p未初始化时解引用是危险操作。
2. 以下关于字符数组和字符指针的描述中,正确的是( )
A. 字符数组和字符指针完全相同,可以互换使用
B. 字符数组名可以被重新赋值指向新字符串
C. 字符数组可以修改其中的字符内容,字符指针指向字符串常量时不能修改内容
D. 字符指针指向字符串常量时可以修改该常量的内容
【答案】C
【解析】字符数组在内存中开辟了独立空间,可以修改数组中的字符。字符指针指向字符串常量时,常量存储在不可写区域,不能通过指针修改内容。A错误,两者有本质区别:数组名是常量不能赋值,指针是变量可以改变指向。B错误,数组名是地址常量,不能被重新赋值。D错误,字符串常量不可修改。
3. 设有定义 char *p = "ABCDE"; 则表达式 *(p+3) 的值是( )
A. 'D'
B. 'C'
C. "D"
D. 'E'
【答案】A
【解析】p指向字符串"ABCDE"的首字符'A',p+3指向第4个字符'D'(下标从0开始),*(p+3)取出字符'D'。B是*(p+2)的值。C中"D"是字符串而非字符。D是*(p+4)的值。
4. 以下关于指针作为函数参数的叙述中,正确的是( )
A. 指针参数传递的是变量的值,函数内无法修改实参
B. 使用指针参数时,实参必须是常量
C. 指针参数与普通值参数效果完全相同
D. 指针参数使得函数可以修改调用者中的变量值
【答案】D
【解析】指针参数传递的是变量的地址,函数通过间接访问可以修改调用者中变量的值,这是指针作为参数的核心优势。A描述的是值传递的特征。B错误,实参应该是变量的地址(如&a),不是常量。C错误,指针参数实现地址传递,可以修改实参指向的内容,与值传递效果不同。
5. 以下程序片段的输出结果是
char s[] = "Hello";
char *p = s;
while (*p) p++;
printf("%d", p - s);( )
A. 6
B. 5
C. 4
D. 0
【答案】B
【解析】p从s开始遍历,while(*p)在*p为'\0'时停止。"Hello"有5个字符加'\0',p最终指向'\0'。p-s=5(两个指针相减得到元素个数差)。这是用指针计算字符串长度的方法。
6. 以下代码片段中,运行时会出现错误的是( )
A. char *p = "ABC"; p[0] = 'D';
B. char s[] = "ABC"; s[0] = 'D';
C. char s[] = "ABC"; char *p = s; *p = 'D';
D. char s[] = "ABC"; char *p = s; p++;
【答案】A
【解析】B中s是字符数组,数组内容可以修改,合法。C中p指向字符数组s,通过p修改s[0]也是合法的。A中p指向字符串常量"ABC",字符串常量存储在只读区域,通过p[0]='D'修改常量内容会导致运行时错误。D中p++使指针后移,是合法操作。
7. 以下程序片段的输出结果是
void f(int x, int *y)
{
x = 100;
*y = 200;
}
main()
{
int a = 1, b = 2;
f(a, &b);
printf("%d %d", a, b);
}( )
A. 100 200
B. 1 2
C. 1 200
D. 100 2
【答案】C
【解析】f(a,&b)调用时,a是值传递,函数内x=100修改的是形参x,不影响实参a,a仍为1。b是地址传递,函数内*y=200通过指针间接修改了实参b,b变为200。值传递形参是实参的副本,地址传递可以通过指针修改实参。
二、简答题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
void copy(char *dest, char *src)
{
while (*src)
{
*dest = *src;
dest++;
src++;
}
*dest = '\0';
}
main()
{
char a[20] = "Hello", b[20];
copy(b, a);
printf("%s
", b);
printf("%d
", b[0] - 'A');
}
【答案】Hello
7
【解析】copy函数将src指向的字符串逐字符复制到dest中。*src非0时循环执行复制并移动指针,最后添加'\0'。b得到"Hello"的副本。b[0]='H','H'-'A'=72-65=7(H的ASCII码比A大7)。
三、案例分析题
9. 以下程序的功能是编写函数将字符串中的小写字母转为大写字母。请填空。
#include <stdio.h>
void toUpper(【1】)
{
while (*s)
{
if (*s >= 'a' 【2】 *s <= 'z')
*s = *s 【3】 ('a' - 'A');
s++;
}
}
main()
{
char str[80];
printf("请输入字符串:");
gets(str);
toUpper(str);
printf("大写:%s
", str);
}
【答案】【1】char *s
【2】&&
【3】-
【解析】【1】函数参数应为字符指针char *s,用于接收字符串首地址。【2】判断小写字母需要两个条件同时满足:大于等于'a'并且小于等于'z',用逻辑与&&连接。【3】小写转大写需减去差值'a'-'A'=32,即*s-32。函数通过指针直接修改原字符串中的字符。
四、综合应用题
10. 编写一个C程序:定义函数strCat,使用指针实现字符串连接功能(不使用strcat库函数)。函数将src指向的字符串连接到dest指向的字符串末尾。在main函数中定义两个字符数组并初始化,调用strCat函数后输出连接结果。
【答案】#include <stdio.h>
void strCat(char *dest, char *src)
{
while (*dest)
dest++;
while (*src)
{
*dest = *src;
dest++;
src++;
}
*dest = '\0';
}
main()
{
char a[40] = "Hello";
char b[] = " World";
strCat(a, b);
printf("%s
", a);
}
【解析】strCat函数分两步:第一个while让dest指针移到目标字符串末尾('\0'处)。第二个while将src的字符逐个复制到dest末尾,同时移动两个指针。最后添加'\0'结束符。注意目标数组a必须有足够空间容纳连接后的字符串。这是用指针实现字符串连接的标准方法。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$