は、私は、charにこのボイドポインタをキャストなぜなぜこのコードは* charをバッファポインタとして使用しますか?再利用する循環バッファのコードを探して
typedef struct CircularBuffer
{
void *buffer; // data buffer
void *buffer_end; // end of data buffer
size_t capacity; // maximum number of items in the buffer
size_t count; // number of items in the buffer
size_t sz; // size of each item in the buffer
void *head; // pointer to head
void *tail; // pointer to tail
} CircularBuffer;
void cb_push_back(CircularBuffer *cb, const void *item)
{
if(cb->count == cb->capacity)
// handle error
memcpy(cb->head, item, cb->sz);
////////////// here's the part I don't understand //////////
cb->head = (char*)cb->head + cb->sz;
//////////////////////////////////////////////////////////
if(cb->head == cb->buffer_end)
cb->head = cb->buffer;
cb->count++;
}
を混乱させる文字の使用に遭遇しましたか?これはある種のCイディオムですか(私はC expereienceを非常に制限しています)?おそらくポインタをインクリメントする便利な方法でしょうか?
位置ポインタのための文字の使用は、同様に、いくつかの異なるバッファコードで再起動します:
/**< Circular Buffer Types */
typedef unsigned char INT8U;
typedef INT8U KeyType;
typedef struct
{
INT8U writePointer; /**< write pointer */
INT8U readPointer; /**< read pointer */
INT8U size; /**< size of circular buffer */
KeyType keys[0]; /**< Element of ciruclar buffer */
} CircularBuffer;
を繰り返しますが、これはポインタに関するいくつかのCプログラマが知っている便利なトリックの一種、何かのように見えます彼らが文字であれば操作が簡単です。しかし、私はただの推測だ。
FYI:型は 'char *'と呼ばれ、 '* char'ではありません。 –
これはtypedefの名前として構造体の名前が見えるのは初めてですが、これは奇妙なものです... – Mandrake