通用指针类型

以下是通过指针传递参数给新线程传递参数方法:

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

你可能感兴趣的:(通用指针类型)