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;