空指针的目的

时间:2014-05-05 18:25:59

标签: c pointers void

  • 平台:Linux 3.2.0 x86(Debian Wheezy)
  • 编译:GCC 4.7.2(Debian 4.7.2-5)

我在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()类似,但是使用了字节到字节的比较。

3 个答案:

答案 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个字节)