【问题标题】:Understanding pointer arithmetic理解指针算术
【发布时间】:2017-03-05 21:37:28
【问题描述】:

我正在阅读 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 &lt; _iob + OPEN_MAX 的声明让我大吃一惊。

  • fp:文件指针
  • _iob: 文件数组
  • OPEN_MAX:整数

这似乎是添加一个文件数组到一个整数,然后评估它是否大于一个文件指针! fp &lt; _iob + OPEN_MAX这句话怎么可能?

【问题讨论】:

  • 这可能是因为 C 中允许使用指针运算。您可以将地址(指针内的值)视为指定内存中位置的整数。如果两个位置相邻,则它们的地址之间的差异是一个数字。
  • 当你在这样的表达式中使用数组时,它会衰减为指向第一个元素的指针。
  • 这是非常基本的指针算法。每本 C 书都有解释。

标签: c arrays pointers operators fopen


【解决方案1】:
  1. 表达式_iob + OPEN_MAX 导致_iob 被视为指向其在该表达式中的第一个元素的指针(这称为array-to-pointer decaying)。
  2. 生成的FILE 指针然后偏移OPEN_MAX+)。
  3. &lt; 然后比较两个生成的FILE 指针(指针只是底层的整数)。

【讨论】:

    【解决方案2】:

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

    fp < _iob + OPEN_MAX
    

    相当于:

    fp < &(_iob[0]) + OPEN_MAX
    

    当您对指向数组元素的指针执行算术运算时,它相当于数组索引。所以这是一样的:

    fp < &(_iob[OPEN_MAX])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-04
      • 1970-01-01
      • 2022-01-23
      • 2010-09-28
      • 2012-07-27
      相关资源
      最近更新 更多