本文共 1325 字,大约阅读时间需要 4 分钟。
以下是通过指针传递参数给新线程传递参数方法:
这种方法首先将要传递的数据转换成通用指针类型,然后传递给新线程,新线程再将其还原成原数据类型: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://mdyzd.baihongyu.com/