你理解错了,编译器知道 void * 的字节数,只是不知道 void 的字节数而已。
void * 跟 void 是两个不同的类型。
void * 的字节数就是地址字长,在64架构里它固定是 64 位长度。这一点是完全确定的。
所以,虽然 void 本身不能参与运算,但 (void *) 作为一个整体却可以参与转化,比如转化为 double(同样是64位),也可以转化为其它的什么。
每个指针本身都是一个值,只不过这个值同时还可以被解读为指向另外一个内存地址的指针而已。void * 指针本身作为一个值,完全是已知长度的确定的值类型,当然可以作为一个整体参与强制类型转换。