如何理解C++通过指针算术实现字符串反转的函数逻辑
reverseString函数逻辑解析
首先附上格式化后的完整代码:
#include <iostream> #include <cstring> using namespace std; char *reverseString(const char *str) { int len = strlen(str); // 原字符串长度为10 char *result = new char[len + 1]; // 动态申请11字节的内存,多1字节存结束符\0 char *res = result + len; // 疑问1:是不是长度变成21? *res-- = '\0'; // 疑问2:是不是减去结束符? while (*str) *res-- = *str++; // 疑问3:是不是交换字符? return result; // 疑问4:为什么不返回res? } int main() { const char* str = "Constantin"; cout << reverseString(str) << endl; }
疑问逐一解答
- 关于
char *res = result + len;
这里是指针偏移运算,不是数值相加。result是新申请的字符数组的首地址,char类型占1字节,所以result + len就是指向数组中偏移10字节的位置,也就是新数组下标为10的最后一个元素,不是长度变成21。 - 关于
*res-- = '\0';
后缀自减运算符优先级高于解引用运算符,执行逻辑为:先给res当前指向的数组最后一位赋值结束符\0,再将res指针向前偏移1位,指向数组下标为9的位置,不存在“减去结束符”的操作。 - 关于
*res-- = *str++;
这不是交换操作,是正序读原字符串、倒序写新数组的操作:每次循环先读取str当前指向的原字符串字符,写入res当前指向的新数组位置,之后str向后偏移1位读取下一个原字符,res向前偏移1位准备写入下一个位置。例如原字符串第一个字符C会被写入新数组下标9的位置,第二个字符o写入下标8的位置,直到str遍历到原字符串的结束符\0时循环终止。 - 关于为什么返回
result不返回res
循环结束后res已经偏移到了新数组首地址的前1位,属于无效地址。而result始终指向新申请的字符数组的首地址,C风格字符串的读取规则是从首地址开始向后遍历直到遇到\0,因此必须返回result。
补充注意点
该实现动态申请的堆内存没有自动释放,实际使用时需要在拿到返回的字符串指针、使用完毕后手动调用delete[]释放对应内存,否则会出现内存泄漏。
内容的提问来源于stack exchange,提问作者yurachika2020
相关产品推荐
相关产品推荐

