C语言void 指针有什么用
发布网友
发布时间:2022-03-23 15:19
我来回答
共4个回答
热心网友
时间:2022-03-23 16:48
void
*
以定义一个指针变量,但不说明它指向哪一种类型数据.
1.
传参:通用类型
可以作为函数模板,链表等参数的通用参数。在使用时,只需要强制类型转换就可以。
2.强制类型转换
有时候由于重载等的干扰,导致需要转换成void
*,来进行取地址。
例如,(void
*)obj.member,就可以取到member的地址;直接&(obj.member)取到的实际上是obj的开始地址。
3.指向0的地址
(void
*)0,指向全是0的地址,相当于NULL。
非void类型显式转换为void类型表达式,用于避免一些代码静态检查工具的警告。
热心网友
时间:2022-03-23 18:06
有时候很有用的,比如WIN消息的转发,线程之间参数的传递,数据在内存中的存贮等。打个比方,有一函数为char*
ToString(
int
type,
void*
data),如果type为1是,data需要指向一个结构体指针,如果type为2时,data需要指向一个类的指针,如果……。如果给你写这么个函数,你该怎么写?当然,还有其他更好的方法。
热心网友
时间:2022-03-23 19:41
把*a
=
'k';改成*((char*)a)
=
'k';就好了
用void*做形参是可以改变实参的值的,但是你的形参是'k',子函数中重新赋值也是'k',你是怎么知道改变或者没有改变的?
举个简单的例子,malloc函数的返回值为void*
但是我们经常这样写:
char
*pc
=
(char
*)malloc(100*sizeof(char));
int
*a
=
(int
*)malloc(100*sizeof(int));
他们都是完全正确的写法,void*所修饰的地址是可以强转成其他任何类型而不会出现不兼容的现象。
还有你的题目为什么要使用
void*呢,你的题目其实使用char
*就完全可以了,子函数中也不需要强转的,但是建议你的实参跟子函数中的重新赋值写成不一样的你才好观察,你写的两个都是'k'变没变你也不知道。
热心网友
时间:2022-03-23 21:32
像开辟空间的malloc函数,他的返回值是一个void型的指针,因为它开辟的内存空间后,指向它说开辟的内存空间的指针指向的类型是多样的...
然后再强制转换成所指向对象的指针...