博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通用指针类型
阅读量:2526 次
发布时间:2019-05-11

本文共 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/

你可能感兴趣的文章
<form>标签
查看>>
vue去掉地址栏# 方法
查看>>
Lambda03 方法引用、类型判断、变量引用
查看>>
was集群下基于接口分布式架构和开发经验谈
查看>>
MySQL学习——MySQL数据库概述与基础
查看>>
ES索引模板
查看>>
HDU2112 HDU Today 最短路+字符串哈希
查看>>
JPanel重绘
查看>>
图片放大器——wpf
查看>>
SCALA STEP BY STEP
查看>>
cocos2d-x学习笔记
查看>>
MySql中的变量定义
查看>>
Ruby数组的操作
查看>>
hdu1181暴搜
查看>>
解码字符串 Decode String
查看>>
json学习笔记
查看>>
工具:linux 性能监控工具-nmon
查看>>
fatal error C1853
查看>>
Ural 1001 - Reverse Root
查看>>
玩转webpack之webpack的entry output
查看>>