以下是通过指针传递参数给新线程传递参数方法:
这种方法首先将要传递的数据转换成通用指针类型,然后传递给新线程,新线程再将其还原成原数据类型:
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