我在string.h中编写了一些类似于memset(),memcpy()等的函数。我使用void指针来避免使函数类型具体。但是当我使用char指针取消引用void指针时,我不知道为什么我要求一个void指针。在我看来,void指针不做任何事情。所以我的问题是void指针有什么作用?举个例子,这是我的一个功能。
size_t damlocs(size_t sizele, void *val, size_t valsiz, void *ele, size_t elesiz)
{
//All that 'ele' is used for is this assignment
char *elebyt = ele;
char *valbyt = val;
size_t eleind = 0;
size_t elebytind = 0;
size_t valbytind = 0;
if(elebyt && valbyt)
{
while(eleind++ < elesiz)
{
elebytind = eleind * sizele;
valbytind = 0;
while(elebyt[elebytind++] == valbyt[valbytind++])
if((valbytind + 1) / sizele == valsiz)
return eleind + 1;
}
}
return 0;
}
描述:damlocs()将找到&#39; val&#39;指向的序列。在&#39; ele [0]&#39;到了[elesiz - 1]&#39;并返回找到序列开头的元素。如果未找到序列,则返回零。它在概念上与stdlib.h中声明的bsearch()类似,但是使用了字节到字节的比较。
答案 0 :(得分:5)
在C中,所有对象指针都可以隐式转换为void指针,因此您可以使用(&x, sizeof x)
轻松地为任何对象x
调用函数。
确实,你会使用某种char
指针来将内存作为一个字节数组来处理,但如果你的函数占用char *
,你需要在呼叫站点。
答案 1 :(得分:1)
Void指针另外告诉程序员:
方法获取指向包含任何内容的内存块的指针
我们可以使char*
隐式转换,但这会造成很多混乱(以及由不那么谨慎的编码员引起的错误)。
答案 2 :(得分:1)
如果我理解这一点,那么它基本上就像其他两个答案所说的那样。本质上,void指针只生成一个指向内存集的指针,并且可以转换为任何其他类型的指针。
基本上,您需要转换为其他指针类型,使指针算法能够正确地处理分配的内存中的特定数据类型。
例如,在您的情况下,您使用了如下所述的字符指针:
char * elebyt = ele; char * valbyt = val;
所以在这种情况下,当你增加指针I.E.
eleind ++
你要向指针添加1个字节,而不是整数的大小(通常是8个字节)