これは、この質問の拡張と考えることができます(私は C のみに興味がありますが、拡張を完了するために C++ を追加します)。
6.3.2.3.3 の C11 標準には、次のように記載されています。
値が 0 の整数定数式、または type にキャストされたそのような式
void *
は、NULL ポインター定数と呼ばれます。
これに対する私の個人的な見解は、整数値が実際には 0 ではない可能性がある null ポインター0
を(void *)0
表しているということですが、それは他の型への 0 キャストをカバーしていません。
ただし、標準は次のように続きます。
ヌル ポインター定数がポインター型に変換される場合、結果のポインターはヌル ポインターと呼ばれます。
キャストは変換メソッドの下にリストされている明示的な変換(C11、6.3) である(int *)0
ため、null ポインターとしてカバーされます。
しかし、それでも私が不思議に思うのは、次のフレーズです
... または型にキャストされたそのような式
void *
...
上記のセマンティクスでは、この句はまったく役に立たないように見えます。問題は、このフレーズはまったく役に立たないということですか? そうでない場合、それにはどのような意味がありますか?その結果、(int *)0
ヌルポインタかどうか?
議論に役立つ別の質問は次のとおりです。(long long)123
「123 に変換long long
」、または「123 型付き」と見なされlong long
ます。つまり、変換はあり(long long)123
ますか? 何もない場合、上記の 2 番目の引用は null ポインターとしてカバーされません。(int *)0