7.4 指针与字符串
数组和指针都能用来表示字符串,但它们的内存分配方式不同,使用方式也不同。
字符数组 vs 字符指针
以字符数组定义的字符串,每个字符都存放在数组里,和普通数组一样可以修改。
c
char s1[] = "hello";
s1[0] = 'H'; // 可以修改
printf("%s\n", s1); // Hello如果让一个指针指向字符串字面量,这个字符串通常存放在只读的常量区。通过这种指针去修改字符串是未定义行为,常常导致程序崩溃。
c
char *s2 = "hello";
// s2[0] = 'H'; // 错误:不要修改字符串字面量
printf("%s\n", s2);需要修改时用字符数组,只读时才用 char * 指向字面量。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
指针赋值不会复制字符串
把一个字符串指针赋给另一个指针,并不会产生新字符串,只是让两个指针指向同一块内存。对其中一个所做的修改,另一个也会看到。
c
char str[] = "hello";
char *s = str;
char *t = s; // s 和 t 指向同一个字符串
s[0] = 'H';
printf("%s\n", s); // Hello
printf("%s\n", t); // Hello用指针遍历字符串
C 字符串以 '\0' 结尾。用指针遍历时,*s 是当前字符,s++ 前进一位,遇到 '\0' 就停止——这正是 strlen、strcpy 等字符串函数内部的写法。
c
char *s = "hello";
while (*s != '\0') {
putchar(*s);
s++;
}正在加载本节练习...