2011-01-31 92 views
4

在尋找循環緩衝區的代碼重用,我遇到一個使用焦炭的這混淆了我爲什麼此代碼使用* 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++; 
} 

爲什麼施放此空指針爲char?這是一種什麼樣的C語言(我有很強的C語言能力)?一個可以方便地增加指針的方法?

使用的位置指針char型的一些不同的緩衝代碼再度出現,以及:

/**< 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程序員知道,東西長約指針如果他們是字符,很容易操縱。但我真的只是在猜測。

+0

僅供參考:該類型被稱爲`char *`,而不是`* char`。 – 2011-01-31 01:24:33

+0

這是我第一次看到struct的名字作爲typedef的名字,這很奇怪... – Mandrake 2011-01-31 17:02:33

回答

6

char *進行強制轉換是爲了使指針運算能夠正確執行,如果您想要以單字節步長移動指針;這總是有效的,因爲根據定義,char具有1個字節的大小。相反,指針運算指針void *不是由C標準定義的,因爲void未指定單個項目的大小。

另一個常見的C成語(與此相關的)是使用unsigned char *當你想訪問某些存儲器作爲「原始字節」(即unsigned類型可以訪問的每個字節,而不管型的無符號值);它通常也用於typedef ed(沿着typedef unsigned char byte;的行),使其更加清晰,您不想將內存解釋爲字符,而是解釋爲原始字節。

5

A char具有一個字節的大小,所以它(或signed charunsigned char)用於當您想簡單地將一部分內存區域作爲字節數組操作時。

+0

那麼有沒有標準的字節大小(heh)數值類型呢? – morgancodes 2011-01-31 15:24:06

3

無效指針只是指向一個值,並沒有類型信息。所以不可能在void指針上執行加法。將其轉換爲其他類型需要進行指針運算。這裏將void *轉換爲char *,然後添加cb-> sz,假設char的大小爲1,則按大小字節向前移動。

1

該轉換使能指針算術;沒有它,因爲cb->head是類型void*,表達cb->head + cb->sz將沒有意義。

一旦指針轉換爲char*,指針加法(char*)cb->head + cb->sz裝置「的對象cb->size字節過去其中cb->head點地址。

相關問題