ポインター型変換は、ポインターが使用されるときに実行されます。この型変換には、 ポインターの割り当て、初期化、および比較が含まれます。
ポインターを含む型変換では、明示的な型キャストを使用する必要があります。
ただし、C ポインターで許可されている割り当ての型変換の場合は、この規則の例外です。次の表の const で修飾された
左辺値は、割り当ての左オペランドとしては使用できません。
左オペランドの型 | 許可されている右オペランドの型 |
---|---|
(オブジェクト) T へのポインター |
|
(関数) F へのポインター |
|
左オペランドの型の修飾子は、右オペランドの修飾子と同じである必要があります。 他のポインターの型が void* の場合は、オブジェクト・ポインターの型が不完全になる場合があります。
C ポインターは型 int とサイズが同じである必要はありません。関数で想定している正しい型が渡されるようにするには、関数に与えられたポインターの 引き数を明示的にキャストする必要があります。 C の汎用オブジェクト・ポインターは void* ですが、汎用関数ポインターは存在しません。
void* への変換
オプションとして型が修飾された、 型 T のオブジェクトを指すすべてのポインターは、 同じ const または volatile 修飾を保持しながら、void* に変換できます。
左オペランドとして許可されている割り当ての型変換 (void* を含む) を次の表に示します。
左オペランドの型 | 許可されている右オペランドの型 |
---|---|
(void*) |
|
オブジェクト T は型が不完全な場合があります。
標準型変換を使用して、関数
へのポインターを型 void* に変換することはできません。
void* に関数を保持するだけの十分なビットがある場合には、明示的に行うことができます。
変換があいまいでない限り、A が B のアクセス可能な基底クラスであれば、
型 B* の右辺値ポインターを、クラス A* の右辺値ポインターに変換できます。
アクセス可能な基底クラスに対する式が、複数の別個のクラスを参照できる場合には、
変換はあいまいなものになります。
結果として得られる値は、派生クラス・オブジェクトの基底クラス・サブオブジェクトを指します。
型 B* のポインターがヌルの場合、
そのポインターは型 A* のヌル・ポインターに変換されます。
基底クラスが、派生クラスの仮想基底クラスである場合、クラスを指すポインターを、
その基底クラスを指すポインターに変換できないことに注意してください。
NULL ポインター定数
評価がゼロになる定数式は、ヌル・ポインター定数 です。 この式をポインターに変換することができます。 このポインターは、ヌル・ポインター (ゼロ値を持つポインター) となり、どのオブジェクトをも指さないようになります。
配列からポインターへの変換
型「N の配列」(N は、配列の単一エレメントの型です) での左辺値または右辺値を、N* に変換できます。 結果は、配列の初期エレメントを指すポインターです。 しかし、式が & (アドレス) 演算子または sizeof 演算子のオペランドとして使用される場合には、この変換は行うことができません。
関数からポインターへの変換
型 T の関数である左辺値を、型 T の関数を指すポインターである右辺値に変換できます。 ただし、式が、& (アドレス) 演算子、() (関数呼び出し) 演算子、 または sizeof 演算子のオペランドとして使用される場合は除きます。
関連参照