void *做形参的作用

jody_go 2009-07-05 10:27:42
在c中,void *类型有什么作用?
既然不能对void *进行操作,那它在函数形参中,又有何用意?
比如
void add(void *p1, void *p2)
{
printf("%d\n", (*p1 + *p2)); //非法操作
}

可是我又有这样的需求,比如实现任意类型数相加,我想这样调用接口:

int main()
{
add(4, 5); //实现整数的相加
add(4.55, 6.77); //实现浮点数相加

......

return 0;
}
...全文
1701 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
玩笑 2009-07-06
  • 打赏
  • 举报
回复

#include <stdio.h>
void add(double a, double b) {
if (a != (long int) a || b != (long int) b) {
printf("%f\n", a + b);
} else {
printf("%ld\n", (long int) (a + b));
}
}

int main() {
add(5, 4);
add(5.1, 4.1);
add(-5.2, 5);
add(5, 5.2);
add(1000000, 100000332);
add('a', 'b');
return 0;
}

玩笑 2009-07-06
  • 打赏
  • 举报
回复
呵呵,不知道怎么弄,感觉用指针的话,好像不大容易,毕竟各种类型占用的内存大小不同,用指针怕是很难判断类型吧
做了一个取巧的方法,不知道能不能达到楼主想要的效果
void add(double a, double b)
{
if(a > (long int)a || b > (long int)b) {
printf("%f\n",a+b);
} else {
printf("%ld\n",(long int)(a+b));
}
}
RJS_April 2009-07-06
  • 打赏
  • 举报
回复
C这么强大,怎么可能不可以实现,第一,你可以用回调函数,第二,你可以用转移表,第三,可以用宏,在你传值的时候同时传入类型……实现方法太多了,看你的情况选择合适的
hotup 2009-07-06
  • 打赏
  • 举报
回复
一句话,用void ×实现不了,
zzcmx2008 2009-07-05
  • 打赏
  • 举报
回复
void * 表示任意指针类型,就是说你可以把任何类型的指针传进来,他都可以接受。
forwrj 2009-07-05
  • 打赏
  • 举报
回复
void * 有个好处,可以转换成任何一种类型,在真正用的时候再把它转换回去.

比如: 在一些数据操作的时候,回调函数的函数类型与参数是一样的,但是它的数据是不一样的,这个时候就要用到void *来做为参数。

举例:

typedef bool(NotifyHandle)(void *pData,Event e);
typedef struct _Package1
{
.....
.....
}Package1;

typedef stryct _Package2
{
.....
.....
.....
}Package2;

bool Package1NotifyHandle(void *pData,Event e)
{
Package1 * p1 = (Package1 *)pData;
p1->.....
p1->.....


......
}

bool Package2NotifyHandle(void *pData,Event e)
{
Package2 * p2 = (Package2 *)pData;
p2->.....
p2->.....
p2->.....

......
}


由于它们的回调函数类型了一样的,所以在注册回调的时候就很方便,不需要多个不同的注册函数,同理在调用的时候也一样。
tianyaqu 2009-07-05
  • 打赏
  • 举报
回复
add()的参数使用float型的,处理要使用int相加的时候,可以把add()的返回值强制为int型
Fleeboy 2009-07-05
  • 打赏
  • 举报
回复
可以接受任何类型的指针
jinzonghui 2009-07-05
  • 打赏
  • 举报
回复
void *是很方便的,比如在动态分配内存空间时,不能确定存放到这块内存池的数据类型是什么,就不能确定是什么类型的指针,就可以用void *,返回一个指针。
这个指针可以接受任何类型的指针,通过强制类型转换就可以作为整形指针、字符指针等。
jody_go 2009-07-05
  • 打赏
  • 举报
回复
可是传了又不可对其操作,那又有什么意义呢?
Walf_ghoul 2009-07-05
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 zhaohongbo83 的回复:]
为啥不用模板呢?
楼主说的这个需求不正好用模板能解决嘛!
[/Quote]
这是c。。。
pengzhixi 2009-07-05
  • 打赏
  • 举报
回复
void *可以接受任何类型的指针,这样你在传参数的时候就不用考虑类型这个问题了。
icefox97 2009-07-05
  • 打赏
  • 举报
回复
前面几位将的很详细,总的思路
void *是一个没有确定的类型,不管作为参数还是返回值,最好都要强转成你想用的类型!
「已注销」 2009-07-05
  • 打赏
  • 举报
回复
c++中是不能把*void类型赋值给指针。
jody_go 2009-07-05
  • 打赏
  • 举报
回复
哦,我这是举个例子呐``
飞天御剑流 2009-07-05
  • 打赏
  • 举报
回复
void *不是表示任意指针类型,虽然void *可以接受任何类型指针的赋值。

void *表示指针指向的对象不确定,它可以通过强制转换为确定的指针类型,但在确定之前,不能使用它。




printf("%d\n", (*p1 + *p2)); //非法操作
--------------------------------------
使用void指针当然是非法的,因为它指向的对象都无法确定,又如何使用呢?




可是我又有这样的需求,比如实现任意类型数相加,我想这样调用接口:
------------------------------------------------------
这个功能,如果是c++,函数模板可以轻松解决。

c的话,没有什么好方法。不外乎一是分别为各种类型写函数;二是使用可变参数函数。
tbocd 2009-07-05
  • 打赏
  • 举报
回复
这样操作是不是有问题?
至少浮点数打印要用%f吧
HelloDan 2009-07-05
  • 打赏
  • 举报
回复
使用时可以再强制转换回来
lingyin55 2009-07-05
  • 打赏
  • 举报
回复
论坛搜到一个帖子,以前讨论过的请教 void * 的作用和用法
lingyin55 2009-07-05
  • 打赏
  • 举报
回复
能够使用好void*的话还是比较方便的,很多书上都有说到,楼主可以找来
看看。
加载更多回复(5)

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧