什么是((无符号char*)b)[i]=c;c中的平均值


void    *ft_memset(void *b, int c, size_t len)
{
size_t i;
i = 0;
while (i < len)
{
((unsigned char *)b)[i] = c;
i++;
}
return (b);
}

例如,您可以编写

b[i] = c;

然而,取消引用类型为void *的指针

void *b

产生不完全类型CCD_ 2的对象。因此编译器将发出一个错误。

因此,首先将类型为void*的指针强制转换为类型为unsigned char*的指针,然后应用下标运算符

((unsigned char *)b)[i] = c;

现在,由于类型unsigned char是一个完整的类型,编译器可以在下标运算符的求值中使用指针算术。

注意下标运算符的求值方式类似

*( ( unsigned char * )p + i ) = c;

指向无效的指针

指向任何类型对象的指针都可以隐式转换为指向void的指针(可选const或volatile限定(,反之亦然。

指向void的指针用于传递未知类型的对象,这在泛型接口中很常见。

当涉及到您的问题时,它与您的函数的作用有关。顾名思义,参数b指向大小为len(字节(的内存块,该内存块必须填充由c描述的特定值。

为了设置内存块的每个字节,我们必须能够单独访问每个字节。我们通过将指针投射到unsigned char(C.中的"字节"类型(来实现这一点

  • 将泛型指针强制转换为指向类型unsigned char的指针:
    ((unsigned char *)b)

  • 访问该数组中的第i个元素:
    [i]

等效于:

unsigned char *bytes = (unsigned char*) b;
for (size_t i=0; i < len; ++i)
bytes[i] = c;

最新更新