2012-09-01 54 views
3

函數定義混亂,我發現這個函數的定義關於用C

void *func(void *param) { 

} 

其實,我對本函數定義了一定的混亂。 void *在函數的返回類型以及參數中表示什麼。我是C的初學者,所以請不要介意。謝謝

void *func(void *param) { 
    int s = (int)param; 
    .... 
} 

看看上面的程序,我找到了。我認爲它應該是

int *s = (int *)param; 

不是嗎?我很困惑

回答

5

void *意味着它是一個沒有特定類型的指針,把它看作是一個通用指針,不像int *一個int指針。

如果需要的話,你可以將它轉換成不同的類型(例如,如果你要用指針做指針運算)。

您可能會發現使用這太問題:Concept of void pointer in C programming

+0

你甚至不需要將它轉換爲不同的類型,它將自己轉換爲任何其他對象指針。 –

2

它只是意味着該函數func需要一個參數是一個指針(任何事情),並返回一個指針(任何事情)。當你使用一個void *時,你告訴編譯器「這是一個指針,但在這一點上它並不重要,它指向什麼」。

當你想要實際使用它指向的數據時,你需要將它轉換爲指向其他類型的指針。舉例來說,如果它指向一個int,您可以創建一個int *變量和反引用是:

int *int_ptr = (int *)param; 
// now (*int_ptr) is the value param is pointing to 
0

返回任何類型的指針。它可以是任何數據類型。

1

你可以把它看成是一個原始指針,沒有什麼比一個地址多,想想看,指針無非地址正確的多,所以他們都應該是相同大小的,在最現代化的系統是32位或64位但如果這就是爲什麼我們說int *char *左右,如果他們都是一樣的大小,以及那是因爲我們需要的方式來詮釋我們都指向型,int *意味着當我們提領去該地址和情況將4個字節解釋爲intchar *意味着當我們取消引用到該地址並獲取一個字節時,如果您取消引用void *,那麼會發生什麼warning: dereferencing ‘void *’ pointer基本上,我們確實無法做到這一點,如果您的影響是編譯器相關的,當我們做算術時也是如此在上面。

那麼爲什麼要使用它們呢?以及我個人不和某些羣體不特別喜歡他們,他們根本允許你創建相當通用子程序,一個很好的例子是memset它設置的內存塊的某個字節的值,它的第一個參數是void *所以不會抱怨是否給出char *int *應注意的是它以每個字節爲基礎工作,並且您需要正確計算數組的總大小。

0
void *func(void *param) { 

} 

param是一個void指針,意味着它是任何引用類型的指針。由於void指針沒有對象類型,除非是大小寫,否則不能解除引用。

so void *param; 
    int *s=(int*)param; 

在這裏,因爲一個參數是一個指針變量,所以你會像你一樣有投它作爲一個指針variable.not到整型。

例如

int x; 
float r; 
void *p=&x; 
int main() 
{ 
    *(int *)p=2; 
    p=&r; 
    *(float*)p=1.1; 
} 

在這個例子中,p是一個void指針。現在在主要方法中,我將p作爲一個int指針,然後作爲一個浮點指針,以便它可以引用第一個整數,然後是float。