1. 程式人生 > >C/C++關於void*儲存int變數的問題

C/C++關於void*儲存int變數的問題

在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