如何指向数组最后一个元素?char数组字符串倒序输出通用实现
通用逆序获取C风格字符串末尾字符的方法
嘿,我来帮你解决这个问题~你想摆脱硬编码数组索引的限制,写出不依赖具体数组长度的通用代码,这个思路非常好,但之前用sizeof(line)的尝试踩了个小坑,我给你拆解下问题,再给出几种靠谱的写法:
为什么你的sizeof写法会出问题?
对于char line[] = "String",sizeof(line)返回的是整个数组的字节数——因为"String"本身是6个字符,再加上C风格字符串必须有的终止符'\0',所以数组总长度是7。这时候&line[sizeof(line)]等价于&line[7],已经超出了数组的有效索引范围(数组索引是从0到6),解引用这个指针属于未定义行为,程序可能崩溃或者输出奇怪的结果。
几种通用的解决方案
方法1:手动遍历找终止符(最基础,不依赖库)
利用C风格字符串以'\0'结尾的特性,我们可以遍历找到终止符的位置,再往前移动一位就是最后一个有效字符:
#include <iostream> using namespace std; int main() { char line[] = "String"; char* endLine = line; // 一直移动指针,直到指向终止符'\0' while (*endLine != '\0') { endLine++; } // 退一位指向最后一个有效字符 endLine--; cout << *endLine << endl; // 输出 'g' return 0; }
这个方法完全不依赖数组的具体长度,不管你把line改成什么字符串,都能正确找到最后一个字符。
方法2:结合strlen函数(更简洁)
如果你愿意引入标准库,可以用<cstring>里的strlen函数,它会直接返回字符串的有效长度(不包含'\0'),然后通过指针运算定位到最后一个字符:
#include <iostream> #include <cstring> // 要包含这个头文件 using namespace std; int main() { char line[] = "String"; // strlen(line)返回6,line + 6指向'\0',减1就到最后一个字符 char* endLine = line + strlen(line) - 1; cout << *endLine << endl; // 输出 'g' return 0; }
这个写法更简洁,而且同样通用,只要是标准的C风格字符串都能适用。
额外提示:如果是C++项目,其实可以用std::string
如果你是在写C++代码,其实更推荐直接用std::string,它的back()方法可以直接获取最后一个字符,比char数组方便太多:
#include <iostream> #include <string> using namespace std; int main() { string line = "String"; cout << line.back() << endl; // 输出 'g' return 0; }
内容的提问来源于stack exchange,提问作者John Tedesco
相关产品推荐
相关产品推荐

