void *类型是什么意思?

boy8765 2004-01-26 08:38:05
在谭浩强的《C程序设计》第二版第278页中有这样一句话:
……不指向任何类型数据的指针(void *类型)……
我想这句话的意思就是说,void *类型就是不指向任何类型数据的指针。

我曾在另外的地方见过,说void *是可以指向不特定类型的指针(也就是说,void *是可以指向任何类型的指针)。

请问,上述两种说法哪一种是正确的?如果你认为这两种说法都是不完整的话,请提出你的看法。帮我弄清楚这个概念。
...全文
2640 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
CEN0921 2004-01-26
  • 打赏
  • 举报
回复
楼上的说的不错
myte 2004-01-26
  • 打赏
  • 举报
回复
void *从本质上讲是一种指针的类型,就像 (char *)、(int *)类型一样.但是其又具有
特殊性,它可以存放其他任何类型的指针类型:例如:
char *array="I am the pointer of string";
void * temp; //temp可以存放其他任何类型的指针(地址)
temp=array; // temp 的指针类型
cout<<array<<endl;
cout<<temp<<endl;
cout<<(char *)temp<<endl;
运行结果:
I am the pointer of string
0x0042510C (这个值就是array指针变量所存储的值)
I am the pointer of string



2.但是不能将void *类型的值赋给其他既定的类型 ,除非 经过显示转换:
例如:
int a=20;
int * pr=&a;
void *p;
pr=p //error,不能将空的类型赋给int *

pr=(int *)p; //ok,经过转换
myte 2004-01-26
  • 打赏
  • 举报
回复
void *从本质上讲是一种指针的类型,就像 (char *)、(int *)类型一样.但是其又具有
特殊性,它可以存放其他任何类型的指针类型:例如:
char *array="I am the pointer of string";
void * temp; //temp可以存放其他任何类型的指针(地址)
temp=array; // temp 的指针类型
cout<<array<<endl;
cout<<temp<<endl;
运行结果:
I am the pointer of string
0x0042510C (这个值就是array指针变量所存储的值)


2.但是不能将void *类型的值赋给其他既定的类型 ,除非 经过显示转换:
例如:
int a=20;
int * pr=&a;
void *p;
pr=p //error,不能将空的类型赋给int *

pr=(int *)p; //ok,经过转换
xcode21 2004-01-26
  • 打赏
  • 举报
回复
后一种正确
fierygnu 2004-01-26
  • 打赏
  • 举报
回复
两种都正确:第一种是从语义上讲,第二种是从使用上讲。

当然第二种只在C语言里是正确的。
lefteye 2004-01-26
  • 打赏
  • 举报
回复
第二种正确。任何类型的指针都可以赋值给void *.
leqian 2004-01-26
  • 打赏
  • 举报
回复
以下择自c++ primer,比较权威:
任何非const 数据类型的指针都可以被赋值给void*型的指针
void*型指针被用于对象的确切类型未知或者在特定环境下对象的类型会发生变化的情况下

有时void*型的指针被称为泛型generic 指针 因为它可以指向任意数据类型的指针例如
int ival;
int *pi = 0;
char *pc = 0;
void *pv;
pv = pi; // ok: 隐式转换
pv = pc; // ok: 隐式转换
const int *pci = &ival;
pv = pci; // 错误: pv 不是一个const void*.
const void *pcv = pci; // ok
但是void*型指针不能直接被解除引用 因为没有类型信息可用来指导编译器怎样解
底层的位模式
yongbo 2004-01-26
  • 打赏
  • 举报
回复
上边帖子笔误修正:
int *pi = &ival;
const char *pc = "a const pointer of char"; //添加此行
pv = pi; //ok: pv指向ival
yongbo 2004-01-26
  • 打赏
  • 举报
回复
在c++里,void*是一种特殊的指针类型,它可以被任何数据指针类型的地址赋值(函数指针不能赋值给它).因此有时void*被称为泛型指针.
// ok: void*可以持有任何非const数据指针类型的地址值
void *pv = pi;
pv = pd;
当然,我们不能操作空类型指针所指向的对象(即不能直接解除引用),只能传送该地址值或与其它地址值作比较.

而在c里,由于编译时刻类型检查是非强制性的,所以有些不同.例如:
// this is a c++program
...
void *pv;
int ival = 1024;
int *pi = &ival;
pv = pi; //ok: pv指向ival
pc = pv; //wrong: 缺少标准类型转换
...
那么,假如以上是个c程序呢?调试一下就知道了.
meijing 2004-01-26
  • 打赏
  • 举报
回复
C 和 C++里的void* 略有不同。
好像是一个可以存放任何指针,另一个则任何类型的指针都不能放(除了void)。
但我现在找不到这段话的原文了。
哪位高手帮忙详细说说?

69,371

社区成员

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

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