void* 指针有什么用?(不是哪些情况用void,而是关于后面的疑问->)int 转v oid* 再转回 int* ,跟 int* 转 float* 再转回 int* 从结果来说不是一样的么?void* 作为"中间人"的功能,float* 也能做到,用void* 仅仅是为了“看起来”合乎逻辑?
学习是最好的投资!
void*指針其實可以用作泛型,你想像一下你在C中要交換兩個變量,如果是兩個整數的話,就像:
void*
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*,萬一給個新手,人家還不敢用,我擦,你這裡面有什麼奧妙麼?
float*
swap((float* )&ai, (float* )&bi, sizeof(int))
的確,void*和其他指標一樣,都是佔同樣大小的記憶體空間,唯一和其他指標不同的就在於你不能對void*進行解引用,看起來其他類型的指標都可以用void*來代替,只要在解引用之前把它轉換為對應類型的指標就OK了!
那麼,如果是這樣的話,那用void*的確是為了看起來合乎邏輯。我暫時也想不到有哪些情況是必須用上void*的!
void * 主要用於抽象資料結構,其特定用途有下列幾項(不限於):
void *
variant
setsockopt
void*其實可以理解為一個context,利用它可以很好的實作C語言物件導向程式設計。我覺得使用void*,不是為了看起來合適,而是一個約定,使用C/C++程式設計的人員看到void*,習慣性的就會認為-這是個私有數據,只有定義的一方才有權解釋;這也是我們在回呼函數中傳遞void*作為userdata的基礎共識。
1.不同類型的指標的sizeof是一樣的,分配內存時,還不知道這塊內存放的是int還是float時,可以讓void*指向這塊內存,用的時候在強轉。 2.int * 作為參數傳遞到函數內部,函數內部暫時沒有使用,編譯的時候會警告,這時,你可以轉一下就不警告了。 3.不同類型的指標+1所跳過的位元組數是不一樣的。
已經有正確答案了,建議看一下stanford cs 107b,在這方面講的很細。
另外所謂"modern language"像c++,java一般都會在語言本身就幫你提供generic的機制,type cast在大多數情況下都認為是不好的。
void*
指針其實可以用作泛型,你想像一下你在C中要交換兩個變量,如果是兩個整數的話,就像:如果要交換小數,那還要寫一個
那麼既然都是把兩個變數的bit pattern交換一下,那就可以把這種方法抽像出來:
因為你不知道究竟要交換多少個bit,所以,還需要一個參數來指定要交換的bit的數量:
有了這樣一個函數,那麼如果想要交換兩個變量,那就可以:
題主修改了題目,我也加點,以我的知識,我不確定題主後面這句話是否正確
但是,用回上面的例子,如果我用
float*
代替void*
,那的確是可以的,但是我為什麼每次調用它都要先做強制類型轉換swap((float* )&ai, (float* )&bi, sizeof(int))
,你把這樣一個接口給另外的一個人使用,他會怎麼想?我擦,你交換兩個整數,還要先轉換float*
,萬一給個新手,人家還不敢用,我擦,你這裡面有什麼奧妙麼?的確,
void*
和其他指標一樣,都是佔同樣大小的記憶體空間,唯一和其他指標不同的就在於你不能對void*
進行解引用,看起來其他類型的指標都可以用void*
來代替,只要在解引用之前把它轉換為對應類型的指標就OK了!那麼,如果是這樣的話,那用
void*
的確是為了看起來合乎邏輯。我暫時也想不到有哪些情況是必須用上void*
的!void *
主要用於抽象資料結構,其特定用途有下列幾項(不限於):variant
, 如setsockopt
;void*其實可以理解為一個context,利用它可以很好的實作C語言物件導向程式設計。我覺得使用void*,不是為了看起來合適,而是一個約定,使用C/C++程式設計的人員看到void*,習慣性的就會認為-這是個私有數據,只有定義的一方才有權解釋;這也是我們在回呼函數中傳遞void*作為userdata的基礎共識。
1.不同類型的指標的sizeof是一樣的,分配內存時,還不知道這塊內存放的是int還是float時,可以讓void*指向這塊內存,用的時候在強轉。
2.int * 作為參數傳遞到函數內部,函數內部暫時沒有使用,編譯的時候會警告,這時,你可以轉一下就不警告了。
3.不同類型的指標+1所跳過的位元組數是不一樣的。
已經有正確答案了,建議看一下stanford cs 107b,在這方面講的很細。
另外所謂"modern language"像c++,java一般都會在語言本身就幫你提供generic的機制,type cast在大多數情況下都認為是不好的。