Red*_*edZ 1 c c-strings strlen pointer-arithmetic
我最近一直在学习C,我遇到了一个strlen的源代码,这真的让我很困惑,我不得不在其他地方查找它,但还不能真正理解它。
斯特伦:
#include <stdio.h>
int strlen(const char *str)
{
const char* eos = str; // 1
while (*eos++); // 2
return (eos - str - 1); // 3
}
int main()
{
int len = strlen("Hello");
printf("Len: %d" , len);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么我们使用局部变量 eos 以及为什么我们在空 while 循环中使用它,然后从 strlen 函数返回最后一行?
为什么会有一个空的 while 循环? 循环递增,eos直到它指向紧接空终止符之后的位置。该表达式*eos++是告诉计算机获取eos当前指向的 char 值,然后递增eos以使其指向下一个 char 的非常紧凑的方式。这个 while 循环中不需要主体。
为什么它使用局部变量? 由于我们正在递增一个指针(即eos),并且我们还需要一个指向最终计算中字符串开头的指针(即str),因此我们不能简单地用于str所有内容。我们至少需要一个其他变量才能完成工作。
最后一行是如何工作的? 该表达式eos - str执行指针减法,因此它计算这两个指针之间的距离并将其作为整数返回。然后我们减去 1 以使答案正确。