我已经将void *
解释为指向未使用的内存块的指针。我还看到void *
被描述为指向任何类型的指针,或者指向任何类型的指针都可以强制转换为void *
。
据我所知,int *
表示指向int
类型的指针。所以记住这一点,void *
字面意思是什么?它是指向void
的指针吗?这似乎不对,因为我不知道void
可能是一种类型。
答案 0 :(得分:4)
void *
是指向void
的指针。
指向
void
的指针可以转换为指向任何对象类型的指针。指向的指针 任何对象类型都可以转换为指向void的指针,然后再返回;结果应该 比较等于原始指针。
编译器不允许您取消引用void*
指针,因为它不知道指向的对象的大小,但是在取消引用它之前需要将void *
类型指针强制转换为正确的类型。
答案 1 :(得分:3)
让我们从这个例子开始:
int a = 65;
int *q = &a;
void *p = q;
char *c = p;
example http://cizixs.u.qiniudn.com/pointer.png
我们定义一个int变量a和一个指向它的int指针q。 void *
指针中的p。
a的起始地址是0x8400
(仅为了简单起见)。
无论何种类型的指针,它们都具有相同的内存大小,它们的值是一个地址。 所以,
printf("%p, %p", *p, *q);
将显示:
0x8400, 0x8400
如图所示,内存中的数据为65000000
(这是little endian)。如果我们想要使用它,我们必须指定它是什么!并且类型就是这样。
printf("%d %c", *p, *q);
如果我们将其打印为整数,我们得到65
。如果我们将它们打印为char,我们会得到A
(asciicode)。
指向p + 1
的{{1}}指针,0x8401
指向q + 1
。
0x8404
:通用类型根据维基百科:
程序可能会将指向任何类型数据的指针(函数指针除外)转换为指向void的指针,并返回原始类型而不会丢失信息,这使得这些指针对多态函数很有用。
是的,void *
定义一个简单的指针单位,它可以转换为任何指针,反之亦然。但是你不能取消引用它,因为它没有指定类型。
如果你想在字节上操纵,你应该总是使用void *
。
void *
与char *
不完全是。
C语言标准没有明确保证不同的指针类型具有相同的大小。
您无法始终希望void *
在不同平台上拥有相同的尺寸。
将char *
转换为char *
可能会造成混淆,并且可能会出错。
答案 2 :(得分:2)
它表示:指向某个内存的指针,但此指针不包含有关可能存储在该内存中的 type 数据的任何信息。
这就是为什么不可能取消引用void *
的原因:取消引用(并获得rvalue或通过左值写入)的操作要求将存储器位置中的位解释为特殊类型,但我们不知道将内存解释为哪种类型。
程序员有责任确保读入的数据与读出的数据类型相匹配。程序员可以通过将void *
转换为指向对象类型的指针来帮助自己。
如果你想拥有一个用于处理多种可能类型的内存的通用接口,而不需要用户进行大量的转换,那么它非常有用。例如,free()
需要void *
,因为在执行free
操作时,类型信息不是必需的。
答案 3 :(得分:2)
void *
是指向未指定类型的数据的指针。因此,它不能直接使用;必须先将其转换为可用的数据类型才能取消引用。