void*(void*)相关函数
1.给定的内存区域搜索给定的字符
void *find_byte(const void *s,char byte,unsigned long n)
{
//首先类型强转
const char *st = (const char *)s;
//然后遍历字节,按照字节查找
for(i = 0;i < n;i++)
{
if(byte == *(st + i))
return (s + i);
}
return NULL;
}
2.memset函数的定义
void *memset(void *s,int c,unsigned long n)
{
//强转类型
char *st = (char *)s;
//按字节进行赋值
for(int i = 0;i < n;i++)
{
*(st + i) = c;
}
return s; //返回值为void*,所以要返回参数中的s地址
}
3.memcpy—用于将指定长度的数据从源地址拷贝到目标地址
void *memcpy(void *dest,const void *src,unsigned long n)
{
char *str1 = (char *)dest;
const char *str2 = (const char *)src;
for(int i = 0;i < n;++i)
{
*(str1 + i) = *(str2 + i);
}
return dest;
}
4.memnove–与memcpy函数不同,该函数能够正确处理源地址和目标地址中出现重叠的情况。
void *memmove(void *dest,const void *src,unsigned long n)
{
char *str1 = (char *)dest;
const char *str2 = (const char *)src;
char buf[n] = {0}; //开一个源地址数据长度的空间
//先将源地址数据复制到所开的空间内
for(int i = 0;i < n;++i)
{
buf[i] = *(str2 + i);
}
//再将所开空间中的数据复制到目标地址
for(int i = 0;i < n;++i)
{
*(str1 + i) = buf[i];
}
return dest;
}
总结
void*是一个特殊的指针类型,可以指向任何类型的地址。
它的神奇之处在于我们可以根据需要将其实现为需要的类型,这样可以节省代码并实现泛型编程。
需要注意的是,带类型的指针不能直接指向void的地址。如果我们想在使用void指针时进行操作,我们需要将其强制转换为相应的类型指针。