回答:
ここでの答えのほとんどが、少なくとも明示的には対処されていない点は、nullポインターは実行中に存在する値であり、nullポインター定数はCソースコードに存在する構文構造です。
ヌルポインタ定数は Karlsonの答えは正しく述べているように、いずれかの値が0(シンプルが持つ整数定数式で0
最も一般的な例である)、またはこのような表現キャストvoid*
(など(void*)0
)。
NULL
はマクロで定義され<stddef.h>
、他のいくつかの標準ヘッダーで定義され、実装定義のNULLポインター定数に展開されます。展開は通常、0
または((void*)0)
(他の言語規則を満たすために外側の括弧が必要です)のいずれかです。
そのため、リテラルは0
、ポインタ型の式を必要とするコンテキストで使用される場合、常に a null pointer
に評価されます。つまり、オブジェクトを指さない一意のポインタ値です。それはnullポインタの表現について何も意味しません。ヌルポインターは、一般にすべてビット0として表されますが、何でも表すことができます。しかし、nullポインターがとして表される場合、またはnullポインター定数である場合でも。0xDEADBEEF
0
(void*)0
stackoverflowの質問に対するこの回答は、これをうまくカバーしています。
これは、とりわけ、メモリの領域をall-bits-zeroに設定できるmemset()
orがcalloc()
、その領域のポインタを必ずしもnullポインタに設定しないことを意味します。彼らはほとんどの実装でそうするでしょうが、言語はそれを保証しません。
この質問は、の重複と見なされていない理由を私は知らないこの1、またはそれはここで話題ですか。
NULL
、またはNULLポインター定数は、そのオブジェクトの値をNULLポインターに設定します。マシンレベルでは、有効なメモリチャンクを指している可能性があります。NULLポインターの逆参照には未定義の動作があります。アドレスでメモリのチャンクにアクセスすること0x0000000
は、文字通り他のものと同様に有効な動作です。このアドレスは、(a)と等しいことを比較しNULL
、(b)Cオブジェクトへのポインターと等しくないことを比較することにより、他のアドレスとは異なります。NULLポインターは、何も指し示していないことを示すために使用される任意のポインター値です。
そこにあるすべてのプラットフォームは、必要に応じてNULLを自由に定義できます。
C標準によると、ポインターにゼロを割り当てると、その値はNULL値に変換されます(そのプラットフォームの場合)。ただし、NULLポインターを取得してintにキャストすると、ゼロになるという保証はありません。そこにあるすべてのプラットフォームで。ただし、ほとんどのプラットフォームではゼロになります。
C言語仕様で見つけることができるものに関する情報。1つのソース、私が保証できない信頼性は、これです:http : //www.winapi.co.kr/pds/doc/ISO-C-FDIS.1999-04.pdf
NULL pointer constant
ます。私の知る限り、それを行うコンパイラはありません。
NULL
ように展開しなければならないマクロ、0
C ++でのいずれか0
または(void *)0
Cには、それは本当の「ヌルポインタ定数」だからです。
これは、C言語で定義されています。これは、同一の不変のマシンアドレスがないためです。もしそうなら、それから抽象化する必要はありません!ほとんどのプラットフォームでは、最終的にNULLが何らかのタイプの0として実装される可能性がありますが、移植性にまったく関心がある場合、これが普遍的であると仮定するのは間違っています。
C標準文書セクションによると6.3.2.3
:
値0の整数定数式、またはそのようなvoid *型にキャストされる式は、nullポインター定数と呼ばれます。55)nullポインター定数がポインター型に変換される場合、結果のポインターはnullポインターと呼ばれます任意のオブジェクトまたは関数へのポインターと等しくない比較を保証します。
これまでのところ、これから脱却したコンパイラは見たことがありません。