1

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

2 つのヌル ポインターが等しくないということですか? しかし、彼らはそうします:

int *a = 0;
int *b = 0;

assert(a == b); // true

この場合、何が不平等なのだろうか?

4

2 に答える 2

3

標準を注意深く読む必要があります。ヌルポインターは、オブジェクトまたは関数へのポインターと等しくありません。オブジェクト (例: &foo) で address-of 演算子を使用して null ポインターを生成することはできません。すべての関数ポインタは、非 NULL であることが保証されています。これら 2 つをまとめると、null ポインターは、ptr-to-object または ptr-to-function と決して等しくないことを意味します。

明確にするために、不等を比較することは、偽であることを意味します (真a == bと同一)。a != b

あなたが引用したパラグラフは、2 つのヌルポインタの比較について何も述べていませんが、次のパラグラフはそうしています:

null ポインターを別のポインター型に変換すると、その型の null ポインターが生成されます。任意の 2 つのヌル ポインターは、比較すると等しくなります。

等しいa == bとは、真であることを意味します (偽と同一a != b)。

于 2012-12-03T13:17:27.850 に答える
1

ステートメントの解釈が間違っている場合は、訂正してください。

int main() {
   void* a = (void *)0;
   int* b;    // pointer b is of different type to a
   printf((a == b) ? "equal" : "not equal");
   return 0;
}

結果:

not equal

声明は、

If a null pointer constant is converted to a pointer type, the resulting pointer, called a null
pointer, is guaranteed to compare unequal to a pointer to any object or function.

は、2 つの異なるポインター型を比較す​​るときに、両方が null ポインターまたは同じオブジェクトまたは関数のポインターであり、等しくない場合にのみ、2 つのポインターを等しいと比較できます。

于 2012-12-03T13:05:52.857 に答える