ポインター型変換

ポインター型変換は、ポインターが使用されるときに実行されます。この型変換には、 ポインターの割り当て、初期化、および比較が含まれます。

C ポインターを含む型変換では、明示的な型キャストを使用する必要があります。 ただし、C ポインターで許可されている割り当ての型変換の場合は、この規則の例外です。次の表の const で修飾された 左辺値は、割り当ての左オペランドとしては使用できません。


表 1. C ポインターの正しい割り当て型変換

左オペランドの型 許可されている右オペランドの型
(オブジェクト) T へのポインター
定数 0
T と互換性のある型へのポインター
void へのポインター (void*)
(関数) F へのポインター
定数 0
F と互換性のある関数へのポインター

左オペランドの型の修飾子は、右オペランドの修飾子と同じである必要があります。 他のポインターの型が void* の場合は、オブジェクト・ポインターの型が不完全になる場合があります。

C ポインターは型 int とサイズが同じである必要はありません。関数で想定している正しい型が渡されるようにするには、関数に与えられたポインターの 引き数を明示的にキャストする必要があります。 C の汎用オブジェクト・ポインターは void* ですが、汎用関数ポインターは存在しません。

void* への変換

オプションとして型が修飾された、 型 T のオブジェクトを指すすべてのポインターは、 同じ const または volatile 修飾を保持しながら、void* に変換できます。

C 左オペランドとして許可されている割り当ての型変換 (void* を含む) を次の表に示します。

表 2. C における void* の正しい割り当て型変換

左オペランドの型 許可されている右オペランドの型
(void*)
定数 0
(オブジェクト) T へのポインター
(void*)

オブジェクト T は型が不完全な場合があります。

C++標準型変換を使用して、関数 へのポインターを型 void* に変換することはできません。 void* に関数を保持するだけの十分なビットがある場合には、明示的に行うことができます。

派生から基底への変換

C++変換があいまいでない限り、AB のアクセス可能な基底クラスであれば、 型 B* の右辺値ポインターを、クラス A* の右辺値ポインターに変換できます。 アクセス可能な基底クラスに対する式が、複数の別個のクラスを参照できる場合には、 変換はあいまいなものになります。 結果として得られる値は、派生クラス・オブジェクトの基底クラス・サブオブジェクトを指します。 型 B* のポインターがヌルの場合、 そのポインターは型 A* のヌル・ポインターに変換されます。 基底クラスが、派生クラスの仮想基底クラスである場合、クラスを指すポインターを、 その基底クラスを指すポインターに変換できないことに注意してください。

NULL ポインター定数

評価がゼロになる定数式は、ヌル・ポインター定数 です。 この式をポインターに変換することができます。 このポインターは、ヌル・ポインター (ゼロ値を持つポインター) となり、どのオブジェクトをも指さないようになります。

配列からポインターへの変換

型「N の配列」(N は、配列の単一エレメントの型です) での左辺値または右辺値を、N* に変換できます。 結果は、配列の初期エレメントを指すポインターです。 しかし、式が & (アドレス) 演算子または sizeof 演算子のオペランドとして使用される場合には、この変換は行うことができません。

関数からポインターへの変換

T の関数である左辺値を、型 T の関数を指すポインターである右辺値に変換できます。 ただし、式が、& (アドレス) 演算子、() (関数呼び出し) 演算子、 または sizeof 演算子のオペランドとして使用される場合は除きます。

関連参照

IBM Copyright 2003