让我们从这个例子开始:
int a = 65;
int *q = &a;
void *p = q;
char *c = p;
(来源:qiniudn.com)
我们定义了一个int变量a和一个指向它的int指针q。 p 在void * 指针中。
a的起始地址是0x8400(为了简单起见)。
指针是地址,仅此而已。
无论是什么类型的指针,它们的内存大小都是一样的,它们的值都是一个地址。
所以,
printf("%p, %p", *p, *q);
将显示:
0x8400, 0x8400
类型:您如何解释日期
如图所示,内存中的数据是65000000(这是little endian)。如果我们想使用它,我们必须指定它是什么! type 就是这样做的。
printf("%d %c", *p, *q);
如果我们将它打印为整数,我们会得到65。如果我们将它们打印为 char,我们会得到 A(asciicode)。
而p + 1 指向0x8401,q + 1 指向0x8404。
void *:通用类型
根据维基百科:
程序可以将指向任何类型数据(函数指针除外)的指针转换为指向 void 的指针并返回到原始类型而不会丢失信息,这使得这些指针对于多态函数很有用。
是的,void * 定义了一个简单的指针单元,它可以转换为任何指针,反之亦然。但是你不能取消引用它,因为它没有指定类型。
如果你想操纵字节,你应该总是使用void *。
char * 不等于void *
不完全是。
C 语言标准没有明确保证不同的指针类型具有相同的大小。
您不能总是希望char * 在不同平台上具有相同的大小。
将char * 转换为int * 可能会造成混淆,并且可能会出错。