指针有什么问题吗?

时间:2019-12-20 13:55:16

标签: c pointers struct

我在理解* 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;
}

2 个答案:

答案 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];

lowhigh或任何其他struct key类型的指针之间进行任何比较或减法是合法的。