理解指针运算

Understanding pointer arithmetic

我正在通读 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怎么可能?

  1. 表达式 _iob + OPEN_MAX 导致 _iob 被视为指向该表达式中第一个元素的指针(这称为 array-to-pointer decaying)。
  2. 生成的 FILE 指针然后偏移 OPEN_MAX+)。
  3. 然后 < 比较两个结果 FILE 指针(指针只是引擎盖下的整数)。

在大多数情况下,当您将数组用作左值时,它会衰减为指向数组第一个元素的指针。所以

fp < _iob + OPEN_MAX

相当于:

fp < &(_iob[0]) + OPEN_MAX

并且当你对指向数组元素的指针进行运算时,它相当于数组索引。所以这与:

fp < &(_iob[OPEN_MAX])