指向指针的通用指针

时间:2016-01-26 23:50:51

标签: c pointers void-pointers

据我所知,根据标准void *是通用指针,void **不是。所以,在我的程序中,我正在尝试转换void *而不是直接输入强制转换void **,但我没有得到预期的结果。我想我在这里缺少一些非常基本的东西。

   #include <stdio.h>

void check(void **p) 
{
    printf("value:  %d\n", *(int *)*p);
}

int main()
{

    int a[] = {6,2,5,1,8};

    int *p;
    p = a;

    void **val;
    val = (void *)p;

    check(val);


    return 0;
}

我有一个void **指针val,它指向int *,但已投放到void *。我将此传递给函数check,它期待void **。在我的printf中,我首先将*pvoid *)投射到int *,然后将其取消。我得到一些随机值。我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:2)

问题在于对printf的调用:

printf("value:  %d\n", *(int *)*p);

main中,valvoid **)包含int *的内容。然后将其传递给check,现在称为p。这需要转换为int *才能正确读取:

printf("value:  %d\n", *(int *)p);

当然,由于void **不是通用指针,因此执行此操作并没有多大意义。最好摆脱没有被使用的额外间接水平:

void check(void *p) 
{
    printf("value:  %d\n", *(int *)p);
}

int main()
{

    int a[] = {6,2,5,1,8};

    int *p;
    p = a;

    void *val;
    val = p;

    check(val);


    return 0;
}

答案 1 :(得分:0)

val = &p;更改为val = p;

可能这是一种&#34;拼写错误&#34;因为你已经正确地传递了一次值,后来也解除了引用它。

编辑:
您可以将val = (void *)p;更改为val = (void *)&p;

答案 2 :(得分:0)

正如你自己所说,void** 不是通用指针。它是一个指向void*类型对象的指针,而不是其他任何东西。使用强制转换将其指向int*类型的对象是类型惩罚。

在您的情况下,您只需将int*转换为void*,然后再转回int*。没有void**参与。