字符数组和字符指针都能用于读取以 \0 结尾的字符串,但存储所有权不同。字符数组保存自己的字符副本;指针可以指向字符串字面量。字符串字面量不应修改,实际代码应优先使用 const char * 表达只读意图。
#include <stdio.h>
int main(void) {
char s1[] = "hello";
s1[0] = 'H';
printf("%s\n", s1); // Hello
const char *s2 = "hello";
// s2[0] = 'H'; // wrong: do not modify a string literal
printf("%s\n", s2);
return 0;
}知识测验
题目
为什么可以执行 s1[0] = 'H'?
互动实验
数组副本与字符串字面量
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
知识测验
题目
执行 second = first 会复制什么?
字符串指针赋值
指针赋值不会复制字符,只会复制地址。first 改为指向另一个字面量时,second 仍保存原地址。需要真正复制字符时,应使用有足够容量的字符数组和 strcpy 等函数。
const char *first = "red";
const char *second = first;
first = "blue";
printf("%s\n", first); // blue
printf("%s\n", second); // red知识测验
题目
比较两个字符串内容应该使用什么?
动手练习
修改字符数组的首字母
实现 uppercase_first(char text[])。字符串非空时,用 toupper 修改 text[0]。用字符数组 word[] = "leaflet" 测试,输出 Leaflet。
- 函数参数使用 char *,并先检查指针与首字符。
- 首字符为小写字母时转换为对应大写字母。
- 用字符数组调用函数并输出修改结果。
动手练习
返回较长字符串的指针
实现 const char *longer(const char *a, const char *b),使用 strlen 返回较长字符串的地址。用 cat 和 telescope 测试,不复制字符。
- 函数接收两个只读字符指针。
- 分别使用 strlen 获得长度。
- 根据比较结果返回 a 或 b,并在调用者中输出。