アラインメント要件に違反しない限り、異なるオブジェクト型のポインターを相互に割り当てることができます。割り当てには (暗黙の) 型変換が含まれるため、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 は実際には強く型付けされていることを認識する必要があります。