对 strlen 在 C 中的工作方式感到困惑

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 函数返回最后一行?

Dav*_*son 5

为什么会有一个空的 while 循环? 循环递增,eos直到它指向紧接空终止符之后的位置。该表达式*eos++是告诉计算机获取eos当前指向的 char 值,然后递增eos以使其指向下一个 char 的非常紧凑的方式。这个 while 循环中不需要主体。

为什么它使用局部变量? 由于我们正在递增一个指针(即eos),并且我们还需要一个指向最终计算中字符串开头的指针(即str),因此我们不能简单地用于str所有内容。我们至少需要一个其他变量才能完成工作。

最后一行是如何工作的? 该表达式eos - str执行指针减法,因此它计算这两个指针之间的距离并将其作为整数返回。然后我们减去 1 以使答案正确。