アラインメント要件に違反しない限り、異なるオブジェクト型のポインターを相互に割り当てることができます。割り当てには (暗黙の) 型変換が含まれるため、afloatを anに割り当てるのと同じくらい (問題はありません) int- ほとんどの場合に機能します。しかし、意味のある変換が不可能な場合は爆破することができます。
char *void *仕様ごとに互換性のあるアラインメント要件があるため、 a を変数に代入することchar **(void **およびその逆) が問題になることはありません。それらは互換性のある表現を持っています。つまり、原則として、char *タイプの式を介してa にアクセスすると (たとえば、実際に a を指しているvoid *a を参照解除することによって)、ほとんどの場合、期待どおりに動作します。もちろん、その逆 ( aを逆参照して a にアクセスする) も当てはまります。void **char *void *char **
たとえば、a を期待し、任意のポインター型を渡すpための変換指定子は、未定義の動作です。ただし、 の場合、実装が C 標準に準拠している限り、特殊なアーキテクチャ (たとえば、異なるポインター表現) でも動作するはずです。printf()void *char *
問題が発生する可能性があるのはエイリアシング分析です。有効な型付け規則により、avoid **と aはエイリアシングchar **できず、プログラマーがその約束を破ると、奇妙なことが起こる可能性があります。効果的な型付け (別名厳密なエイリアシング) のために、C は実際には強く型付けされていることを認識する必要があります。