使用(void*)传递参数

zengcity 2009-10-30 03:47:42
不知道使用(void*)传递参数一般都是什么样的格式,如下代码对么?
虽然这个代码最后运行正常,但是总觉得不好,以及还有一个warning,请指教.


void Convert(int type,void* param);
void Number(void* param);
void String(void* param);

void Convert(int type,void* param)
{
switch(type) {
case 0:
Number(param);
break;
case 1:
String(param);
break;
default:
break;
}
}

void Number(void* param)
{
int num;
num = (int*)param; //会有一个warning C4047: '=' : 'int ' differs in levels of indirection from 'int *'
printf("Number:%d\n",num);

}

void String(void* param)
{
char* str;
str = (char*)param;
printf("String:%s\n",str);
}


int main(int argc, char* argv[])
{
Convert(0,(void*)2);
Convert(1,(void*)"hello");
return 0;
}
...全文
3047 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
wotur 2009-10-31
  • 打赏
  • 举报
回复
没有没不好的,改转换的地方强转就好了,
void *比较通用
ma515423196 2009-10-31
  • 打赏
  • 举报
回复
谁有中文版的编译器;用于c语言的
cattycat 2009-10-31
  • 打赏
  • 举报
回复 1
没问题这样,
Convert(0,(void*)2);

把整型转换成void*,用的时候再转换为int;
如果是
int i=2;
Convert(0,(void*)&i);
那转换的时候就要 int num=*(int*)param;
总之匹配就行。
  • 打赏
  • 举报
回复
你就认为可以支持类型转换就是了,也没其他用途。
zcgzdhxm 2009-10-31
  • 打赏
  • 举报
回复
学习了
东大坡居士 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 thefirstz 的回复:]
C/C++ code#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>void Convert(int type,void* param);void Number(void* param);void String(void* param);void Convert(int type,void*¡­
[/Quote]

???????????
jackyjkchen 2009-10-30
  • 打赏
  • 举报
回复
void*可以传递任何类型,memcpy的参数不就是么
liangyonglou 2009-10-30
  • 打赏
  • 举报
回复
void *可以接受任何类型的指针
delphiwcdj 2009-10-30
  • 打赏
  • 举报
回复
gx
zengcity 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 thefirstz 的回复:]
C/C++ code#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>void Convert(int type,void* param);void Number(void* param);void String(void* param);void Convert(int type,void* param){switch(type){case0:
Number(param);break;case1:
String(param);break;default:break;
}
}void Number(void* param){int num;
num= (int)param;//mark printf("Number:%d\n",num);

}void String(void* param){char* str;
str= (char*)param;
printf("String:%s\n",str);
}int main(int argc,char* argv[]){
Convert(0,(void*)2);
Convert(1,(void*)"hello");return0;
}
[/Quote]

oh yeah 正常!!!
zengcity 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 codespy 的回复:]
num = (int*)param; //会有一个warning C4047: '=' : 'int ' differs in levels of indirection

在(int*)param前加个*
[/Quote]
编译没错,运行报错.

[Quote=引用 4 楼 selooloo 的回复:]
num = (int*)param;
num不是指针啊

int *num;
num = (int*)param;
printf("Number:%d\n",*num);

这样应该就OK了

void *可以接受任何类型的指针,使用时转换成相应的类型就可以
[/Quote]
编译没错,运行报错.

[Quote=引用 10 楼 rabbitlzx 的回复:]
C/C++ codeint main(int argc,char* argv[])
{//Convert(0,(void*)2);// 这句可以这样改,你上面的写法是把2转换为指针地址了,下面的是将int型指针转换为void* Convert(0,(void*)&2);
Convert(1,(void*)"hello");return0;
}void Number(void* param)
{int num;//num = (int*)param;//会有一个warning C4047: '=' : 'int ' differs in levels of indirection from 'int *'//对应的,这块也要进行相应的修改 num=*( (int*)param) ;
printf("Number:%d\n",num);

}
[/Quote]
Convert(0,(void*)&2编译报错
wanghao111 2009-10-30
  • 打赏
  • 举报
回复
void*指针只支持几种有限的操作:
与另一个指针进行比较;
向函数传递void*指针或从函数返回void*指针;
给另一个void*指针赋值。
void*可以保存任何类型对象的地址,但不允许使用void*指针操纵它所指向的对象。
woods2001 2009-10-30
  • 打赏
  • 举报
回复
转来转去,要保持同种类型
通用性不好
huqinglu123 2009-10-30
  • 打赏
  • 举报
回复
int num;
num = (int*)param; //会有一个warning C4047: '=' : 'int ' differs in levels of indirection from 'int *'
printf("Number:%d\n",num);

这么明显的类型不同,应该出错才对的,就一个警告...
@井九 2009-10-30
  • 打赏
  • 举报
回复
非必要不用
我看你有戏 2009-10-30
  • 打赏
  • 举报
回复
rabbitlzx 2009-10-30
  • 打赏
  • 举报
回复



int main(int argc, char* argv[])
{
//Convert(0,(void*)2);
// 这句可以这样改,你上面的写法是把2转换为指针地址了,下面的是将int型指针转换为void*
Convert(0,(void*)&2);
Convert(1,(void*)"hello");
return 0;
}

void Number(void* param)
{
int num;
//num = (int*)param; //会有一个warning C4047: '=' : 'int ' differs in levels of indirection from 'int *'
//对应的,这块也要进行相应的修改
num = *( (int*)param) ;
printf("Number:%d\n",num);

}

lgccaa 2009-10-30
  • 打赏
  • 举报
回复
昵称很不好取 2009-10-30
  • 打赏
  • 举报
回复
#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <windows.h>

void Convert(int type,void* param);
void Number(void* param);
void String(void* param);

void Convert(int type,void* param){
switch(type){
case 0:
Number(param);
break;
case 1:
String(param);
break;
default:
break;
}
}

void Number(void* param){
int num;
num = (int)param; //mark
printf("Number:%d\n",num);

}

void String(void* param){
char* str;
str = (char*)param;
printf("String:%s\n",str);
}


int main(int argc, char* argv[]){
Convert(0,(void*)2);
Convert(1,(void*)"hello");
return 0;
}

rabbitlzx 2009-10-30
  • 打赏
  • 举报
回复
void* 就相当于一个通用的指针类型,如果你函数的参数类型不确定时可以使用void* 不过要注意正确地进行转换
加载更多回复(6)

70,023

社区成员

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

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