我在理解* binsearch函数中某些代码行的机制时遇到问题。特别地,低和高是两个指针,分别被初始化为&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;
}
答案 0 :(得分:2)
如果两个指针属于同一数组,则可以进行比较。
尤其是您可以使用指针执行或不执行以下操作:
仅当两个指针都指向同一数组时,指针比较才有效。
所有关系运算符都可用于比较相同类型的指针。
所有等式和不等式运算符可用于所有指针类型。
指针不能相除或相乘。
因此,允许low < high
,并且在这种情况下效果很好。
答案 1 :(得分:2)
这是完全合法的代码。标准摘录(C11草案)
6.5.8.5
比较两个指针时,结果取决于 指向对象地址空间中的相对位置。 如果两个指向对象类型的指针都指向同一个对象,或者 都指向同一数组的最后一个元素 对象,它们比较相等。如果指向的对象是 同一聚合对象的成员,指向结构的指针 稍后声明的成员比较大于指向的指针 在结构中较早声明的成员,以及指向的指针 下标值较大的数组元素比较大于 指向具有较低下标的同一数组元素的指针。
还
6.5.5.9
当减去两个指针时,两个指针都应指向 同一数组对象,或在数组的最后一个元素之后 宾语;结果是下标的差异 两个数组元素。
换句话说,比较或减去指向同一数组(或数组之外的元素)中的元素的指针是合法的。减法得出两个指针之间所指向类型的元素的数量,而比较则提供有关哪个元素在数组中的较高索引处的信息。
现在在给定的代码中,定义为:
struct key *low = &tab[0];
struct key *high = &tab[n];
在low
和high
或任何其他struct key
类型的指针之间进行任何比较或减法是合法的。