自己写strchr函数的时候return这一步有一部分没看懂

When I write my own strchr function, there is a part in the return step that I don't understand

我正在尝试为学校编写自己的 strchr 函数,但有些地方我不明白。

char    *ft_strchr(const char *s, int c)
{
    size_t  i;
    size_t  len;

    i = -1;
    len = ft_strlen(s);
    while (++i < len + 1)
    {
        if (s[i] == (char)c)
        {
            return (((void *)&((char *)s)[i]));
        }
    }
    return (NULL);
}

我已经完成了代码的总体结构和测试阶段。但是我无法理解 return 这一步。

return (((void *)&((char *)s)[i]));

你能简单给我解释一下这是怎么回事吗?

那条线使事情过于复杂,并不是最好的解决方案。

让我们仔细看看:

char    *ft_strchr(const char *s, int c)
{
...
   return (((void *)&((char *)s)[i]));
...
}

首先,return 不是函数,因此表达式不需要括号。 (甚至还有2级不必要的括号)那一行和这一行完全一样:

   return (void *)&((char *)s)[i];
...

该行采用一些值并将其转换为 void*。转换指针通常是为了将地址解释为指向另一种类型的指针,而不是之前的指针。通常不需要转换为 void*,因为任何指向数据对象的指针都可以在需要时自动转换为 void*

但是看函数return类型。它是 char*,而不是 void*。将 return 值转换为 void* 在这里没有多大意义。相反,如果需要,它应该转换为 char* 。但该值已经是 char* 类型。所以把那个东西放下吧。

   return &((char *)s)[i];

这就是您真正需要的。转换的重点是你有一个指向 const char 的指针,你需要一个指向 char.

的指针

你可以这样写更易读:

   return (char *)&s[i];

但最终两个版本都会 return 具有相同类型的相同值。

我假设使用简化的表达式,您更容易理解 return 语句中需要什么。