我对C中的void *指针有点困惑。特别是在阅读了这个问题后:Is the sizeof(some pointer) always equal to four?,其中一个人说不能保证sizeof(int *)== sizeof(double *)
我的问题是:是否保证sizeof(void *)> = sizeof(任何其他指针类型)? 换句话说,我是否可以总是将一个some_type *指针指向void *指针,然后将其作为some_type *返回?
答案 0 :(得分:27)
仅数据指针。 void *
可以保存任何数据指针,但不能保存函数指针。
这是C FAQ。
void *只能保证保存对象(即数据)指针;它 将函数指针转换为void *类型是不可移植的。 (一些 机器,功能地址可以非常大,比任何数据都大 指针。)
至于第一部分,是的,不同的类型可以有pointers of different sizes:
答案 1 :(得分:10)
指针中存储的值是内存的地址。如果您使用的是32位系统,那么指向内存的指针将长达32位(或4个字节)。如果您使用的是64位系统,那么指向内存的指针将长达64位(或8个字节)。
保存内存中位置的数据大小与内存中该位置所代表的数据大小无关。
至于char *
与double *
的区别,char *
可以指向任何位置,但double *
必须指向8字节的内容边界。必须根据您所处理的处理器规则对齐较大的数据。因此,指向小数据的指针通常与指向大数据的指针不兼容(例如,您不应将double *
指针指向char *
地址);但是你要向另一个方向保存(例如,你可以指向char *
地址的double *
指针。