【问题标题】:Is there anything wrong with the pointer?指针有问题吗?
【发布时间】:2019-12-20 13:55:16
【问题描述】:

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

【问题讨论】:

  • 当指针指向同一个数组的元素时,比较指针是很有可能的。如果你可以将一个数字加到一个指针上得到另一个指针,那么你可以减去两个指针得到一个数字。合乎逻辑,不是吗?
  • @n.'pronouns'm。那么在这种情况下,这想显示指针在数组中的位置对吗?
  • 是的。比较指针的结果和比较对应数组索引的结果是一样的。
  • NULL 不等于 0。您的程序可能会因该表达式而崩溃。

标签: c pointers struct


【解决方案1】:

这是完全合法的代码。标准摘录(C11草案)

6.5.8.5

当比较两个指针时,结果取决于 指向的对象在地址空间中的相对位置。 如果两个指向对象类型的指针都指向同一个对象,或者 都指向同一数组的最后一个元素 对象,它们比较相等。如果指向的对象是 同一聚合对象的成员,指向结构的指针 稍后声明的成员比较大于指向的指针 在结构前面声明的成员,以及指向 具有较大下标值的数组元素比较大于 指向具有下标的同一数组的元素的指针。

还有,

6.5.5.9

当两个指针相减时,两个指针都指向 相同的数组对象,或数组的最后一个元素 目的;结果是下标的差异 两个数组元素。

换句话说,比较或减去指向同一数组内(或数组外)元素的指针是合法的。减法产生两个指针之间指向的类型元素的计数,比较提供有关哪个元素在数组中的更高索引处的信息。

现在在给定的代码中,定义是:

struct key *low = &tab[0];
struct key *high = &tab[n];

lowhigh 或任何其他类型为 struct key 且指向它们之间某处的指针之间的任何比较或减法都是合法的。

【讨论】:

  • 我知道我们可以在两个指针之间进行比较,就像我提到的情况一样。但是,如果我写了while(low=high++)这样的一行代码,是否合法?因为在条件语句中,例如,我需要写== 以防我想比较是否相等,但它与指针的情况不同吗?
  • @HoangNam Equality 也是对指针的有效操作。只有当它们都指向内存中的同一个对象时,它才会返回 true。
【解决方案2】:

如果两个指针属于同一个数组,则可以比较它们。

特别是这些是您可以使用指针执行或不执行的操作:

  • 仅当两个指针指向同一个数组时,指针比较才有效。

  • 所有关系运算符都可用于比较相同类型的指针。

  • 所有等式和不等式运算符均可用于所有指针类型。

  • 指针不能相除或相乘。

所以low &lt; high 是允许的并且在这种情况下运行良好。

【讨论】:

  • "如果两个指针属于同一个数组,则可以比较它们" ...或者超过数组的最后一个元素(high == NKEYS 可能就是这种情况)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多