自己写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
语句中需要什么。
我正在尝试为学校编写自己的 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
语句中需要什么。