以下是通過指標傳遞參數給新線程傳遞參數方法:
這種方法首先將要傳遞的資料轉換成通用指標類型,然後傳遞給新線程,新線程再將其還原成原資料類型:
void *start_routine(void *arg);
int main(void) {
int connfd;
…
pthread_create(&tid, NULL, start_routine, (void *)connfd);
…
}
void *start_routine(void *arg) {
int connfd;
connfd =(int ) arg;
…
}
這種方法雖然簡單,但卻有很大的局限性。如:要求arg的類型必須能被正確地轉換成通用指標類型,而且可傳遞的參數只有一個。
對下面的答案我並不滿意,還是沒懂。
因為對C語言並不精通,所以 對於轉換(void *)connfd有感覺納悶了,明明是整形,它轉化為通用指標到底變為什麼,有什麼作用呢?
void *指標只能儲存對象(也就是資料)指標。將函數指標轉換為void *指標是不可移植的。(在某些機器上,函數指標可能很大—–比任何資料指標都大。)但是,可以確保的是,所有的函數指標類型都可以相互轉換,只要在調用之前轉回了正確的類型即可。因此,可以使用任何函數類型(通常是int (*)()或void (*)(),即未指明參數、返回int或void的函數)作為通用函數指標。如果你需要一個既能容納對象指標又能容納函數指標的地方,可移植的解決方案是使用包含void *指標和通用函數指標(任何類型都可以)的聯合。
下面是自己寫的函數,希望能用VC調試看看,代碼如下:
#include <stdio.h>
int test(void *arg) {
int connfd;
connfd =(int ) arg;
return connfd+1;
}
int main(void) {
int connfd,a;
connfd=5;
a=test((void *)connfd);
printf("%d",a);
}
輸出:6
#include <stdio.h>
int main(void) {
int connfd;
connfd=5;
printf("%d",(void *)connfd);
}
輸出:5
目前還不知道怎麼理解,但暫時都將它看作:把整形換為指標型進行傳遞,(此時指標變數不是用來存放地址的)然後可以通過強制類型轉化再次變為整形。
void* 表指向的物件類型不確定。void * 可以和任何指標直接做變換,除了函數指標外。
如:
int *pi;
void *pv;
pi=pv; //注意在C++編譯器中必須轉換 pi=(int*)pv;
pv=pi;
由於void * 可以和任何指標直接做變換,除了函數指標外,在C編譯器下,我們知道malloc函數的傳回型別是void*,所以下2句是等價的
int *p =(int*)malloc(100*sizeof(int));
int *p =malloc(100*sizeof(int))
但是void* 不能做取值和小表操作
紅色部分內容轉自http://blog.csdn.net/yun_xy/archive/2005/10/14/503937.aspx