2017-03-05 103 views
-2

我正在通過K & R C讀取。在後面有一些示例fopen代碼。我不特別理解一部分。理解指針運算

#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.你能想到的地址(內部指針的值)爲指定的內存位置的整數。如果兩個地點相鄰,地址之間的差異是一個數字。 – StoryTeller

+0

在類似的表達式中使用數組時,它將衰減爲指向第一個元素的指針。 – Barmar

+0

這是非常基本的指針算術。這在每本C書中都有解釋。 – Olaf

回答

1

在大多數情況下,當您使用數組作爲l值時,它將衰減爲指向數組的第一個元素的指針。所以

fp < _iob + OPEN_MAX 

等同於:

fp < &(_iob[0]) + OPEN_MAX 

而當你在一個指針數組元素執行算術,它等同於數組索引。因此,這是一樣的:

fp < &(_iob[OPEN_MAX]) 
2
  1. _iob + OPEN_MAX導致_iob爲這個表達式內的指針到它的第一個元素(這被稱爲array-to-pointer decaying)待處理的表達。
  2. 由此產生的FILE指針然後被OPEN_MAX+)抵消。
  3. <然後比較兩個結果FILE指針(指針只是引擎蓋下的整數)。