通用指针类型
来源:互联网 发布:火车头数据库发布模块 编辑:程序博客网 时间:2024/06/02 19:56
以下是通过指针传递参数给新线程传递参数方法:
这种方法首先将要传递的数据转换成通用指针类型,然后传递给新线程,新线程再将其还原成原数据类型:
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> 输出:5
int main(void) {
int connfd;
connfd=5;
printf("%d",(void *)connfd);
}
目前还不知道怎么理解,但暂时都将它看作:把整形换为指针型进行传递,(此时指针变量不是用来存放地址的)然后可以通过强制类型转化再次变为整形。
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
- 通用指针类型
- 通用指针类型
- 空指针,通用指针
- C51:通用、存储器指针
- 空指针NULL、野指针、通用指针
- 空指针,野指针,通用指针
- 野指针、空指针和通用指针
- 指针类型
- 指针类型
- 指针类型
- 指针类型
- 通用类型转换方法
- 1.9 通用类型系统
- C#通用类型转换器
- 通用类型系统
- 通用的枚举类型
- 平台通用类型
- c++ 通用类型
- VC读取网页信息原代码
- GridBagLayout使用
- 代码抽象与泛类型初探之C语
- 自行开发高效精简的二进制序列化库(支持精简框架集)
- 从C调用JavaScript函数代码。
- 通用指针类型
- POJ 1200 Crazy Search
- 关于mysql读取、写入出现乱码的解决方法(个人总结)
- zoj 2554
- 分页查询浅谈
- mpegts.c文件分析
- 汇编学习笔记 (1)
- 为什么java使用人数最多呢?
- C++ 的析构与atexit()