取消引用void指针

时间:2012-12-04 01:30:11

标签: c arrays void-pointers dereference

希望能够更好地理解答案 在this帖子中给出,有人可以向我解释一下 可以使用循环缓冲区,如果 不,为什么不呢。

#define CB_TYPE_CHAR     0
#define CB_TYPE_FLOAT    1

...

typedef struct CBUFF
{
    uint16 total;       /* Total number of array elements */
    uint16 size;        /* Size of each array element */
    uint16 type;        /* Array element type */
    uint16 used;        /* Number of array elements in use */
    uint16 start;       /* Array index of first unread element */
    void *elements;     /* Pointer to array of elements */
} CBUFF;

...

void cbRead(CBUFF *buffer, void *element)
{
    if (buffer->type == CB_TYPE_CHAR)
    {
    /* The RHS of this statement is the problem */
        *(char*)element = *(buffer->elements[buffer->start]);
    }

    /* Other cases will go here */

    buffer->start = (buffer->start + 1) % buffer->total;

    --buffer->used;
}

我知道LHS必须被转换为char才能使我能够 取消引用void指针。我也明白这段代码 片段:

buffer->elements[buffer->start]

给出元素的'buffer-> start'元素的地址 数组,我也想取消引用才能进入 该地址的内容。或者至少这是我从中得到的 K&安培;:R

鉴于这一切,我如何告诉编译器的内容 该地址的内存是一个char,它是可以的 取消引用它?这里有一些事情,我不知道 理解。

2 个答案:

答案 0 :(得分:13)

buffer->elements也是void *,所以你需要先施展它才能用它做任何事情:

*(char*)element = ((char *)buffer->elements)[buffer->start];

答案 1 :(得分:5)

  

考虑到这一切,我如何告诉编译器该地址的内存内容是一个char,并且可以取消引用它?

嗯,你已经在该系列的LHS上完成了它:

*(char*)element = *(buffer->elements[buffer->start]);

要解除buffer->elements[n],你也需要投射它。

*(char*)element = *((char*)buffer->elements)[buffer->start];

现在的问题是该演员表是否正确。我不能告诉你,因为你没有发布buffer->elements的初始化。