在日常开发中,处理字符串是再常见不过的任务。尤其是在C语言环境下,没有现成的string类可用,这时候就得靠指针来“手动”管理字符串。很多人一开始觉得指针难,可一旦上手,就会发现它其实挺直接。
字符串本质就是字符数组
C语言里,字符串其实就是以\0结尾的字符数组。比如定义一个字符串:
char str[] = "hello";
系统会在内存中分配6个字节,最后一个是自动加上去的\0。而我们可以通过指针指向这个数组的首地址,然后逐个访问字符。
用指针遍历字符串
假设我们要统计字符串长度,不调用strlen,自己动手写一个:
int my_strlen(char *s) {
int len = 0;
while (*s != '\0') {
len++;
s++;
}
return len;
}
这里*s取的是指针当前指向的字符,s++让指针往后移一位。循环直到遇到\0结束。这种方式比用下标访问数组更贴近内存操作的本质。
修改字符串内容
注意,如果字符串是通过双引号定义的,比如:
char *s = "hello";
*s = 'H'; // 危险!可能崩溃
这种写法在某些系统上会出错,因为"hello"可能放在只读区。正确做法是用字符数组:
char s[] = "hello";
*s = 'H'; // 没问题,现在是可写的
这样就能安全地通过指针修改第一个字符,变成"Hello"。
拼接两个字符串
想把两个字符串连起来,也可以用指针操作。比如把src接到dest后面:
void str_concat(char *dest, char *src) {
while (*dest) dest++; // 移到dest末尾
while (*src) {
*dest = *src;
dest++;
src++;
}
*dest = '\0';
}
第一个while把dest指针移到\0的位置,第二个while把src的内容一个个拷过去,最后补上新的\0。这就是简易版的strcat。
实际应用场景
你在写一个配置解析工具,读到一行"name=张三",想把等号后面的值提取出来。用指针就很方便:
char *line = "name=张三";
char *value = strchr(line, '='); // 找到'='
if (value) {
value++; // 跳过等号
printf("值是:%s\n", value); // 输出 张三
}
strchr返回的是指针,指向找到的字符位置,加一之后就指向后面的内容,干净利落。
指针操作字符串看起来低级,但在嵌入式、系统编程、性能敏感场景里非常实用。掌握这些小技巧,写代码时会更踏实。