私はCのvoid *ポインターと少し混乱しています。特にこの質問を読んだ後は sizeof(some pointer)は常に4に等しいですか? 、一人の人がsizeofの保証はないと言っています(int *)== sizeof(double *)
私の質問は、sizeof(void *)> = sizeof(他のポインタ型)の保証はありますか?言い換えると、常にsome_type *ポインターをvoid *ポインターに割り当て、それをsome_type *として取得できますか?
データポインタのみ。 void *
は任意のデータポインタを保持できますが、関数ポインタは保持できません。
これが C FAQ です。
void *は、オブジェクト(つまりデータ)ポインタを保持することのみが保証されています。関数ポインタをvoid *型に変換することはできません。 (一部のマシンでは、関数アドレスが非常に大きく、データポインターより大きくなる場合があります。)
最初の部分については、そうです、異なるタイプは 異なるサイズのポインター を持つことができます:
ポインタに格納される値は、メモリへのアドレスです。 32ビットシステムを使用している場合、メモリへのポインタは32ビット(または4バイト)の長さになります。 64ビットシステムを使用している場合、メモリへのポインタは64ビット(または8バイト)の長さになります。
メモリ内の場所を保持するデータのサイズは、メモリ内のその場所で表されるデータのサイズとは関係ありません。
char *
とdouble *
の違いについては、char *
は任意の場所を指すことができますが、double *
は8バイト境界に沿って何かを指す必要があります。より大きなデータは、使用しているプロセッサのルールに従って調整する必要があります。そのため、小さなデータへのポインタは通常、大きなデータへのポインタと互換性がありません(たとえば、double *
ポインタをchar *
アドレスにポイントしないでください)。しかし、あなたは他の方向に行くことを節約しています(たとえば、char *
ポインタをdouble *
アドレスにポイントすることができます)。