希望能更好地理解这篇文章中提供的答案,有人可以请解释一下下面的环形缓冲区实现是否可行,如果不行的话,请说明原因。
#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类型,并且可以解引用它呢?这里有些东西我还不太理解。
*(buffer->elements[buffer->start])
是对void*
的解引用。 - Sergey Kalinichenko