搜尋

首頁  >  問答  >  主體

c++ - 关于void*的作用

void* 指针有什么用?(不是哪些情况用void,而是关于后面的疑问->)int 转v oid* 再转回 int* ,跟 int* 转 float* 再转回 int* 从结果来说不是一样的么?void* 作为"中间人"的功能,float* 也能做到,用void* 仅仅是为了“看起来”合乎逻辑?

PHPzPHPz2767 天前1066

全部回覆(5)我來回復

  • 黄舟

    黄舟2017-04-17 11:20:49

    void*指針其實可以用作泛型,你想像一下你在C中要交換兩個變量,如果是兩個整數的話,就像:

    void swap_int(int* lhs, int* rhs)
    {
        int tmp = *lhs;
        *lhs = *rhs;
        *rhs = tmp;
    }
    

    如果要交換小數,那還要寫一個

    void swap_float(float* lhs, float* rhs)
    {
        ;//
    }
    

    那麼既然都是把兩個變數的bit pattern交換一下,那就可以把這種方法抽像出來:

    void swap(void* lsh, void* rhs)
    {
        ;//
    }
    

    因為你不知道究竟要交換多少個bit,所以,還需要一個參數來指定要交換的bit的數量:

    void swap(void* lsh, void* rhs, size_t size)
    {
        ;//
    }
    

    有了這樣一個函數,那麼如果想要交換兩個變量,那就可以:

    swap(&ai, &bi, sizeof(int));
    swap(&af, &bf, sizeof(float));
    

    題主修改了題目,我也加點,以我的知識,我不確定題主後面這句話是否正確

    用void* 只是為了「看起來」合乎邏輯

    但是,用回上面的例子,如果我用float*代替void*,那的確是可以的,但是我為什麼每次調用它都要先做強制類型轉換swap((float* )&ai, (float* )&bi, sizeof(int)),你把這樣一個接口給另外的一個人使用,他會怎麼想?我擦,你交換兩個整數,還要先轉換float*,萬一給個新手,人家還不敢用,我擦,你這裡面有什麼奧妙麼?

    的確,void*和其他指標一樣,都是佔同樣大小的記憶體空間,唯一和其他指標不同的就在於你不能對void*進行解引用,看起來其他類型的指標都可以用void*來代替,只要在解引用之前把它轉換為對應類型的指標就OK了!

    那麼,如果是這樣的話,那用void*的確是為了看起來合乎邏輯。我暫時也想不到有哪些情況是必須用上void*的!

    回覆
    0
  • 迷茫

    迷茫2017-04-17 11:20:49

    void * 主要用於抽象資料結構,其特定用途有下列幾項(不限於):

    1. 作為 variant, 如 setsockopt
    2. 隱藏具體實作(ADT):http://en.wikipedia.org/wiki/Abstract_data_type#Example:_implementation_of_the_stack_ADT
    3. 作為回呼介面的 userdata/opaque,該 userdata/opaque 作為一個參數,傳給回呼處理函數,你可以把這個看成一個Context。

    回覆
    0
  • 阿神

    阿神2017-04-17 11:20:49

    void*其實可以理解為一個context,利用它可以很好的實作C語言物件導向程式設計。我覺得使用void*,不是為了看起來合適,而是一個約定,使用C/C++程式設計的人員看到void*,習慣性的就會認為-這是個私有數據,只有定義的一方才有權解釋;這也是我們在回呼函數中傳遞void*作為userdata的基礎共識。

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 11:20:49

    1.不同類型的指標的sizeof是一樣的,分配內存時,還不知道這塊內存放的是int還是float時,可以讓void*指向這塊內存,用的時候在強轉。
    2.int * 作為參數傳遞到函數內部,函數內部暫時沒有使用,編譯的時候會警告,這時,你可以轉一下就不警告了。
    3.不同類型的指標+1所跳過的位元組數是不一樣的。

    回覆
    0
  • 迷茫

    迷茫2017-04-17 11:20:49

    已經有正確答案了,建議看一下stanford cs 107b,在這方面講的很細。

    另外所謂"modern language"像c++,java一般都會在語言本身就幫你提供generic的機制,type cast在大多數情況下都認為是不好的。

    回覆
    0
  • 取消回覆