取消引用void指针

为了更好地理解这篇文章中给出的答案,有人可以向我解释是否可以实现以下循环缓冲区,如果没有,为什么不能。

#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] 

给出了elements数组的’buffer-> start’元素的地址,我也想取消引用它以获取该地址的内容。 或者至少这是我从K&R那里得到的。

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

buffer->elements也是一个void *所以你需要在它之前使用它来执行任何操作:

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

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

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

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

要去除buffer- buffer->elements[n]你还需要转换它。

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

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