2017-03-05 13 views
-2

私はK & Rを読んでいます。彼の後ろにいくつかのサンプルfopenコードがあります。私は特に1つの部分を理解していません。ポインタ算術を理解する

#define OPEN_MAX 20 

FILE _iob[OPEN_MAX] = { 
    { 0, NULL, NULL, _READ, 0 },    // _READ = 01 
    { 0, NULL, NULL, _WRITE, 1 },   // _WRITE = 02 
    { 0, NULL, NULL, _WRITE | _UNBUF, 2 } // _UNBUF = 04 
}; 

FILE *fopen(char *name, char *mode) 
{ 
    FILE *fp; 

    for (fp = _iob; fp < _iob + OPEN_MAX; fp++) 
    /* ... */ 
} 

ステートメントfp < _iob + OPEN_MAXは私を驚かせるものです。

  • fp:ファイルポインタ
  • _iob:ファイル配列
  • OPEN_MAX:整数

それはそれはだかどうかを評価し、整数にファイル配列を追加しているようですファイルポインタがより大きい!ステートメントfp < _iob + OPEN_MAXはどのように可能ですか?

+0

Cでポインタの算術演算が許可されている可能性があります。ポインタ(ポインタ内の値)はメモリ内の位置を指定する整数と考えることができます。 2つの場所が隣接している場合、その住所の違いは数字です。 – StoryTeller

+0

そのような式で配列を使用すると、最初の要素へのポインタに減衰します。 – Barmar

+0

これは非常に基本的なポインタ演算です。それはすべてのCの本で説明されています。 – Olaf

答えて

1

ほとんどの場合、l値として配列を使用すると、配列の最初の要素へのポインタに減衰します。だから、

fp < _iob + OPEN_MAX 

は同等です:

fp < &(_iob[0]) + OPEN_MAX 

そして、あなたは配列要素へのポインタに算術演算を実行するとき、それは、配列のインデックスと同等です。これは次のように同じです:

fp < &(_iob[OPEN_MAX]) 
2
  1. _iob(これはarray-to-pointer decayingと呼ばれる)は、この表現内のその最初の要素へのポインタとして扱わさせる_iob + OPEN_MAX発現。
  2. 結果のFILEポインタは、OPEN_MAX+)によってオフセットされます。
  3. <は結果として得られた2つのポインタを比較します(ポインタはフードの下の整数にすぎません)。FILE