使用指针实现字符串的反转之前,首先要知道以下这几点:
1.数据在计算机中存储都是有地址的。
2.字符串实际上是由字符组成的数组,每个字符都占用一个存储单元。这意味着字符串的存储实际上是字符的存储。
3.当我们使用指针来获取字符串变量的地址时,实际上获取的是字符数组中第一个成员(也就是第一个字符)的地址。字符串变量名代表着字符数组的首地址。
4. 字符数组中的每个成员在内存中是连续存储的,即它们的地址是相邻的,地址差相等。这使得我们能够通过递增指针来遍历整个字符串。
我们这里可以看一下"hello"的实际储存:
这里是相应的代码:
#include<stdio.h>
int main(void) {
char str[] = "hello"; // 后面默认跟着一个'\0'的结束符
for (int i = 0; i < 5; i++) {
printf("\n%p",&str[i]);
}
return 0;
}
这里知道字符串中各个字符的地址,所以我们要实现字符串反转就容易了,大致的思路是:地址之间修改互换即可,值互换。
#include <stdio.h>
#include <string.h>
// by: 代码工匠
void reverse(char *str); // 函数声明,原则先声明后调用
void reverse(char *str) {
char *start = str; // 取首地址
char *end = start + strlen(str) - 1; // 减掉'\0' 取尾地址
char temp; // 中间变量
while (start < end) {
temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
}
int main(void) {
char str[] = "hello";
printf("原始字符串: %s\n", str);
reverse(str);
printf("反转后字符串: %s\n", str);
return 0;
}
简单的完善一下函数:
void reverse(char *str) {
if(str != NULL) {
char *start = str;
char *end = str + strlen(str) - 1;
while (start < end) {
char temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
}
}
最后运行结果:
这里成功实现将字符串“hello” 反转成“olleh”了。