次のコード(取得 ここから ):
_int* ptr = int();
_
visual C++でコンパイルし、ポインタを値初期化します。
そんなことがあるものか?つまり、int()
はタイプint
のオブジェクトを生成し、int
をポインタに割り当てることはできません。
上記のコードはどのように違法ではありませんか?
int()
は値が0の定数式であるため、nullポインター定数を生成する有効な方法です。最終的には、int *ptr = NULL;
の言い方が少し異なります。
int()
は0
を生成するため、これはNULL
と交換可能です。 NULL
自体は0
として定義され、CのNULL
は(void *) 0
です。
これはエラーになることに注意してください。
int* ptr = int(5);
そしてこれはまだ機能します:
int* ptr = int(0);
0
は特別な定数値であるため、ポインター値として扱うことができます。 0
などの1 - 1
を生成する定数式は、nullポインター定数としても使用できます。
式int()
は、デフォルトで初期化された定数の整数、つまり値0に評価されます。この値は特別です。これは、NULL状態へのポインターを初期化するために使用されます。
N3290(C++ 03は同様のテキストを使用)から、4.10ポインター変換[conv.ptr]段落1(強調は私のものです):
1 nullポインタ定数は整数型の整数型のprvalue(5.19)ゼロと評価される整数型またはstd :: nullptr_t型のprvalueです。 nullポインター定数は、ポインター型に変換できます。 結果はその型のnullポインタ値ですそしてオブジェクトポインタまたは関数ポインタ型の他のすべての値と区別できます。このような変換は、ヌルポインタ変換と呼ばれます。 [...]
int()
は、ゼロと評価される整数型の整数型の整数定数式prvalueであるため(一口です!)、ポインター型を初期化するために使用できます。ご覧のように、 0
は、特殊な場合の唯一の整数式ではありません。
まあintはオブジェクトではありません。
ここで起こっていることは、int()によって決定されるメモリアドレスを指すようにint *に指示していることだと思います。
したがって、it()が0を作成する場合、int *はメモリアドレス0を指します。