理解指针算术

时间:2017-03-05 21:37:28

标签: c arrays pointers operators fopen

我正在阅读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如何可能?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

fp < _iob + OPEN_MAX

相当于:

fp < &(_iob[0]) + OPEN_MAX

当您对指向数组元素的指针执行算术运算时,它等同于数组索引。所以这与:

相同
fp < &(_iob[OPEN_MAX])