2017-11-10 10 views
7

2つのポインタ変数aとbがある場合、 "a < b"という文を使用するのはどういう意味ですか?メモリアドレスの値を比較することになっていますか?もしそうなら、コンピュータのメモリアドレスの順序はどうなりますか?関係演算子を使用してポインタを比較するのはどういう意味ですか?

+1

このようなことは非常に言語固有のものと思われます。いくつかの素朴なケースでは、ポインターは文字通り(または同じように扱うことができる)メモリーロケーションです。他のケースでは、それらは非常に特殊なタイプであり、演算子はタイプ固有の動作をします。 – jdv

+0

関連[私はポインタが "p> nullptr" well-formedですか?](https://stackoverflow.com/q/26590267/1708801) –

+0

[私の答えは、 ](https://stackoverflow.com/a/31151779/1708801)も関連しています。 –

答えて

6

CとC++では、同じ配列に2つのポインタがあり、それらの相対的な順序を見たい場合に、比較演算子を使用するポインタを比較できます(この規則の例外は少しありますがビット)。例えば、pqここに示されているようにアレイarrの中央にどこか各ポイント、と想像:「配列のインデックスであり、この場合

  int arr[9]; 
      int* p = &arr[1]; 
      int* q = &arr[4]; 

    +-----+-----+-----+-----+-----+-----+-----+-----+-----+ 
arr |  |  |  |  |  |  |  |  |  | 
    +-----+-----+-----+-----+-----+-----+-----+-----+-----+ 
      ^    ^
      |     | 
      p     q 

p < qを尋ねる表現よりも低いでp点配列内のインデックスはqを指していますか? "上記の文脈では、答えは「はい」です。 pqが逆転した場合、まったく同じ要素を指している場合、答えは「いいえ」となります。

CとC++の言語標準では、同じ配列を指していないポインタを比較した結果は不定であり、無関係なオブジェクトがメモリ内でかなりランダムに散在する可能性があるため直感的に意味があります。実装に依存した方法で関連しています(スタックが増えたり減ったりしますか?)

これの例外の1つは、配列の最後の1つのオブジェクトを比較して、アレイ。たとえば、この設定を見てみましょう:

ここ
  int arr[9]; 
      int* p = &arr[1]; 
      int* q = &arr[9]; 

    +-----+-----+-----+-----+-----+-----+-----+-----+-----+ 
arr |  |  |  |  |  |  |  |  |  | 
    +-----+-----+-----+-----+-----+-----+-----+-----+-----+ 
      ^           ^
      |            | 
      p            q 

、qは、配列arrに指していません。ただし、言語仕様を使用すると、pとqを安全に比較できます。これは、たとえば、C++でこのイテレータスタイルのループを安全に使用できる理由です。

for (int* itr = arr; itr != arr + /* arr's size */; itr++) { 
    ... 
} 
+0

追加する: "...同じ配列に2つのポインタがある場合は_またはオブジェクト_"この配列の説明は、1つのオブジェクトが1つの配列であるかのように単一のオブジェクトにも適用されます。 'some_type x;' '&x + 1>&x'はよく定義されています。 §6.5.84 – chux

+0

同じオブジェクト内の 'double b 'へのポインタを持つstructオブジェクトの' int a'へのポインタなど、同じ集約オブジェクトのメンバへのポインタを比較することもできます。 –

+0

@EricPostpischil私はあなたがそれをすることができるか分からなかった。厳密なエイリアス違反を避けるために、さまざまな型のオブジェクト間で 'char *'ポインタを使う必要があると思いますか? – templatetypedef

関連する問題