c:空隙大小*

fac*_*cha 23 c void-pointers

我对C中的void*指针有点困惑.特别是在读完这个问题后:sizeof(某些指针)是否总是等于4?,一个人说没有保证sizeof(int*)== sizeof(double*)

我的问题是:是否有sizeof(void*)> = sizeof(任何其他指针类型)的保证?换句话说,我是否可以始终为void*指针指定some_type*指针,然后将其作为some_type*返回?

cni*_*tar 27

只有数据指针.void *可以保存任何数据指针,但不能保存函数指针.

这是一个C FAQ.

void*只能保证保存对象(即数据)指针; 将函数指针转换为void*类型是不可移植的.(在某些机器上,函数地址可能非常大,比任何数据指针都大.)

至于第一部分,是的,不同的类型可以有不同大小的指针:

  • 但是,在现代系统中,不同大小的指针几乎不存在. (4认同)

unp*_*nic 10

存储在指针中的值是存储器的地址.如果您使用的是32位系统,那么指向内存的指针将长达32位(或4个字节).如果您使用的是64位系统,那么指向内存的指针将长达64位(或8个字节).

保存位置在内存中的数据大小与内存中该位置表示的数据大小无关.

至于a如何char *与a 不同double *,char *可以指向任何位置,但double *必须指向沿着8字节边界的某些东西.必须根据您所处理的处理器规则对齐较大的数据.因此,指向小数据的指针通常与指向大数据的指针不兼容(例如,您不应该指向double *指向char *地址的指针); 但你char *要向另一个方向保存(例如,你可以指向一个指向double *地址的指针).

  • 这是一个很好的实际答案,但看起来OP正在寻找一个标准迂腐的答案. (3认同)