C/C++關於void*儲存int變數的問題
阿新 • • 發佈:2019-01-28
在C/C++中,有時候會遇到將int值儲存在void*這種型別中,比如在一個通用實現的連結串列節點中,資料區data是void*,
而我們只需要儲存int時,該如何處理最簡單呢?
一般來說,void*是一個指標,它指向一塊記憶體地址,對於32位機器void*是32位的,對於64位機器,void*是64位大小的,
那麼如何將int儲存到void*中呢。
我們再來思考一下,void*指向一塊記憶體地址,假設定義如下變數:
void * p
那麼p實際上是一個32位或者64位大小的整型值!
在我們以int方式輸出p時,如printf("%d\n", (int)p),輸出的就是記憶體地址的整型值。
既如此,有變數int a=0x123,可以做如下轉換:
p = (void*)a
此時p指向記憶體地址為a,不過這個地址並不存在,而且我們也不需要存在,因為我們只關心p的值。
也因此p可以儲存一個int值。
可以定義如下巨集便於轉換:
#define INT_TO_POINTER(i) ((void*) (long) (i))
#define POINTER_TO_INT(p) ((int) (long) (p))
int在有些平臺可能是16位,這裡中間加了一個long是因為long在所有平臺至少是32位,指標型別也是至少是32位,這樣處理對於編譯器而言更加安全。
轉載請註明出處!謝謝。
演算法公眾號:acm-clan