我在理解 *binsearch 函数中某些代码行的机制时遇到了问题。特别是,low 和 high 是两个指针,分别初始化为 &tab[0] 和 &tab[n]。在下一行我看到low<high
我认为它无效,因为不可能比较两个指针的两个地址。下一行也有同样的问题。我不知道我是否正确,我需要大家的一些想法。
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAXWORD 100
int getword(char *, int);
struct key *binsearch(char *, struct key *, int);
/* count C keywords; pointer version */
main()
{
char word[MAXWORD];
struct key *p;
while (getword(word, MAXWORD) != EOF)
if (isalpha(word[0]))
if ((p=binsearch(word, keytab, NKEYS)) != NULL)
p->count++;
for (p = keytab; p < keytab + NKEYS; p++)
if (p->count > 0)
printf("%4d %s\n", p->count, p->word);
return 0;
}
/* binsearch: find word in tab[0]...tab[n-1] */
struct key *binsearch(char *word, struck key *tab, int n)
{
int cond;
struct key *low = &tab[0];
struct key *high = &tab[n];
struct key *mid;
while (low < high) {
mid = low + (high-low) / 2;
if ((cond = strcmp(word, mid->word)) < 0)
high = mid;
else if (cond > 0)
low = mid + 1;
else
return mid;
}
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
这是完全合法的代码。标准摘录(C11 草案)
6.5.8.5
当两个指针进行比较时,结果取决于所指向的对象在地址空间中的相对位置。如果指向对象类型的两个指针都指向同一个对象,或者都指向同一数组对象的最后一个元素,则它们比较相等。如果指向的对象是同一个聚合对象的成员,则指向后面声明的结构体成员的指针比较大于指向结构体中前面声明的成员的指针,指向下标值较大的数组元素的指针比较大于指向同一数组元素的指针带下标。
还,
6.5.5.9
当两个指针相减时,两个指针都应指向同一个数组对象的元素,或者指向数组对象最后一个元素之后的一个;结果是两个数组元素的下标之差。
换句话说,比较或减去指向同一数组内(或数组外的元素)元素的指针是合法的。减法产生两个指针之间所指向的类型的元素的计数,比较提供有关哪个元素位于数组中较高索引的信息。
现在在给定的代码中,定义是:
struct key *low = &tab[0];
struct key *high = &tab[n];
Run Code Online (Sandbox Code Playgroud)
low
和之间的任何比较或减法或指向它们之间某处的high
任何其他类型的指针都是合法的。struct key