7.4 指针与字符串
C++ 通常使用 std::string 处理文本。本节研究 C 风格的空字符结尾字符串,是为了观察数组和指针如何配合。
字符数组 vs 字符指针
以字符数组定义的字符串,每个字符都存放在数组里,和普通数组一样可以修改。
cpp
char s1[] = "hello";
s1[0] = 'H'; // 可以修改
std::cout << s1 << std::endl; // Hello如果让一个指针指向字符串字面量,这个字符串通常存放在只读的常量区。在 C++ 中,字符串字面量应当按 const char* 对待,不能修改。
cpp
const char* s2 = "hello";
// s2[0] = 'H'; // 错误:不要修改字符串字面量
std::cout << s2 << std::endl;需要修改字符时用字符数组,只读时才用 const char* 指向字面量。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
指针赋值不会复制字符串
把一个字符串指针赋给另一个指针,并不会产生新字符串,只是让两个指针指向同一块内存。对其中一个所做的修改,另一个也会看到。
cpp
char str[] = "hello";
char *s = str;
char *t = s; // s 和 t 指向同一个字符串
s[0] = 'H';
std::cout << s << std::endl; // Hello
std::cout << t << std::endl; // Hello用指针遍历字符串
C 风格字符串以 '\0' 结尾。用指针遍历时,*s 是当前字符,s++ 前进一位,遇到 '\0' 就停止。
cpp
const char* s = "hello";
while (*s != '\0') {
std::cout << *s;
s++;
}正在加载本节练习...