理解指针运算
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
: 整数
好像是将一个文件数组加一个整数,然后判断它是否大于一个文件指针!语句fp < _iob + OPEN_MAX
怎么可能?
- 表达式
_iob + OPEN_MAX
导致 _iob
被视为指向该表达式中第一个元素的指针(这称为 array-to-pointer decaying)。
- 生成的
FILE
指针然后偏移 OPEN_MAX
(+
)。
- 然后
<
比较两个结果 FILE
指针(指针只是引擎盖下的整数)。
在大多数情况下,当您将数组用作左值时,它会衰减为指向数组第一个元素的指针。所以
fp < _iob + OPEN_MAX
相当于:
fp < &(_iob[0]) + OPEN_MAX
并且当你对指向数组元素的指针进行运算时,它相当于数组索引。所以这与:
fp < &(_iob[OPEN_MAX])
我正在通读 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
怎么可能?
- 表达式
_iob + OPEN_MAX
导致_iob
被视为指向该表达式中第一个元素的指针(这称为 array-to-pointer decaying)。 - 生成的
FILE
指针然后偏移OPEN_MAX
(+
)。 - 然后
<
比较两个结果FILE
指针(指针只是引擎盖下的整数)。
在大多数情况下,当您将数组用作左值时,它会衰减为指向数组第一个元素的指针。所以
fp < _iob + OPEN_MAX
相当于:
fp < &(_iob[0]) + OPEN_MAX
并且当你对指向数组元素的指针进行运算时,它相当于数组索引。所以这与:
fp < &(_iob[OPEN_MAX])