6

C では、NULL ポインターと 0 を指すポインターの違いは何ですか?

4

5 に答える 5

7

ISO / IEC 9899:TC2は次のように述べています6.3.2.3 Pointers

3値が0の整数定数式、またはvoid *型にキャストされたそのような式は、nullポインター定数と呼ばれます55)。nullポインター定数がポインター型に変換される場合、結果のポインターはnullポインターと呼ばれます。任意のオブジェクトまたは関数へのポインタと等しくないことを比較することが保証されています

マクロNULLは、実装定義のnullポインター定数に展開されます。

任意の2つのnullポインタは等しく比較されます。

于 2011-09-30T16:20:16.823 に答える
6

はいあります。NULL標準では、常に無効なメモリを指していると規定されています。NULLしかし、ポインターの整数表現が 0 でなければならないとは述べていません。0以外の実装に出くわしたことはありませんが、それは標準で義務付けられていません。

リテラル0をポインターに代入しても、ポインターが 0 の整数表現を想定するわけではないことに注意してください。これは、特殊な null ポインター値がポインター変数に代入されることを意味します。

于 2011-09-30T16:14:45.377 に答える
3

0ポインタコンテキストでリテラルを評価することは、と同じですNULL。コンパイラがNULLポインタを表すために使用するビットパターンはすべて非表示になっています。

于 2011-09-30T16:17:54.593 に答える
1

古い comp.lang.c FAQ には null ポインターに関する大きなセクションがあり、一読の価値があります。

comp.lang.c null ポインター

于 2011-09-30T16:21:45.730 に答える
0

NULLポインタは、無効なメモリ領域を何らかの形で表す必要があるという考え方です。
したがって、下位メモリセグメントではOSコードがマップされているため、メモリ内のこの領域はユーザーのプログラムに属していないがOSコードにマップされているため、値0が使用されています(NULLポインタを表すため)。

于 2011-09-30T16:36:44.283 に答える