ある型の値へのポインターは、別の型へのポインターに変換できます。 ただし、結果は、各型のストレージのアラインメント要件とサイズの違いにより、未定義になることがあります。 オブジェクトへのポインターは、型のストレージ アラインメントの厳密さが同じか、それ以下のオブジェクトへのポインターに変更でき、変更なしで元に戻すことができます。
void へのポインターは、情報の制限や損失なしに任意の型へのポインターとの間で変換できます。 結果が元の型に戻される場合、元のポインターが復元されます。
ポインターが、型は同じでも修飾子が異なるか、修飾子の追加された別のポインターに変換される場合、新しいポインターは、新しい修飾子の制限を除いて、古いポインターと同じになります。
ポインター値は、整数値に変換することもできます。 変換パスは、次の規則に従い、ポインターのサイズと整数型のサイズによって決まります。
ポインターのサイズが整数型のサイズ以上である場合、ポインターは、浮動小数点型に変換できない点を除けば、変換で符号なしの値と同様の動作をします。
ポインターが整数型より小さい場合、ポインターは最初に整数型と同じサイズのポインターに変換されてから、整数型に変換されます。
逆に、整数型は、次の規則に従ってポインター型に変換することができます。
整数型がポインター型と同じサイズである場合、変換では整数値が単にポインター (符号なし整数) として処理されます。
整数型のサイズがポインター型のサイズと異なる場合、整数型は最初に「符号付き整数型からの変換」と「符号なし整数型からの変換」の表で指定された変換パスを使用して、ポインターのサイズに変換されます。 その後、これがポインター値として扱われます。
値 0 の整数定数式、または void* 型にキャストされた整数定数式は、型キャスト、代入、または任意の型のポインターとの比較によって変換できます。 この操作によって、同じ型の別の null ポインターと等しい null ポインターが生成されます。しかしこれは、関数またはオブジェクトへのポインターとは等しくありません。 定数 0 以外の整数はポインター型に変換できますが、その結果は移植可能ではありません。