void *究竟是什么意思

时间:2014-04-03 02:43:42

标签: c pointers void-pointers

我已经将void *解释为指向未使用的内存块的指针。我还看到void *被描述为指向任何类型的指针,或者指向任何类型的指针都可以强制转换为void *
据我所知,int *表示指向int类型的指针。所以记住这一点,void *字面意思是什么?它是指向void的指针吗?这似乎不对,因为我不知道void可能是一种类型。

4 个答案:

答案 0 :(得分:4)

void *是指向void的指针。

C11:6.3.2.3指针:

  

指向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 *是指向未指定类型的数据的指针。因此,它不能直接使用;必须先将其转换为可用的数据类型才能取消引用。