我正在阅读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 :(得分:2)
_iob + OPEN_MAX
会将_iob
视为指向此表达式中第一个元素的指针(称为array-to-pointer decaying)。FILE
指针会被OPEN_MAX
(+
)偏移。<
然后比较两个结果FILE
指针(指针只是引擎盖下的整数)。答案 1 :(得分:1)
在大多数情况下,当您使用数组作为l值时,它会衰减到指向数组第一个元素的指针。所以
fp < _iob + OPEN_MAX
相当于:
fp < &(_iob[0]) + OPEN_MAX
当您对指向数组元素的指针执行算术运算时,它等同于数组索引。所以这与:
相同fp < &(_iob[OPEN_MAX])