Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 比较K&;R(数组索引与指针)_C - Fatal编程技术网

C 比较K&;R(数组索引与指针)

C 比较K&;R(数组索引与指针),c,C,我的问题在代码下面 在结构一章中介绍了K&R中的两种不同的bin搜索,一种使用数组索引处理结构(第134页),另一种使用指向结构的指针(第136页) binsearch决定结构中的特定字符串,keytab[n].word是否与数组中的字符串相匹配,word 下面是结构声明本身及其初始化。该结构包含一组c键盘以及它们出现的次数 struct key { char *word; int count; } keytab[] = { "auto",

我的问题在代码下面

在结构一章中介绍了K&R中的两种不同的bin搜索,一种使用数组索引处理结构(第134页),另一种使用指向结构的指针(第136页)

binsearch决定结构中的特定字符串,
keytab[n].word
是否与数组中的字符串相匹配,
word

下面是结构声明本身及其初始化。该结构包含一组c键盘以及它们出现的次数

    struct key {
       char *word;
       int count;
   } keytab[] = {
       "auto", 0,
       "break", 0,
       "case", 0,
       "char", 0,
       "const", 0,
       "continue", 0,
       "default", 0,
       /* ... */
       "unsigned", 0,
       "void", 0,
       "volatile", 0,
       "while", 0
   };
这是第一个binsearch

/* binsearch:  find word in tab[0]...tab[n-1] */
   int binsearch(char *word, struct key tab[], int n)
   {
       int cond;
       int low, high, mid;

       low = 0;
       high = n - 1;
       while (low <= high) {
           mid = (low+high) / 2;
           if ((cond = strcmp(word, tab[mid].word)) < 0)
               high = mid - 1;
           else if (cond > 0)
               low = mid + 1;
           else
               return mid;
       }
       return -1;
   }
/*b搜索:在选项卡[0]中查找单词…选项卡[n-1]*/
int-bin搜索(字符*单词,结构键选项卡[],int-n)
{
int-cond;
int低、高、中;
低=0;
高=n-1;
while(低0)
低=中+1;
其他的
中途返回;
}
返回-1;
}
以下是使用指向结构的指针而不是数组索引的binsearch:

/* binsearch: find word in tab[0]...tab[n-1] */
   struct key *binsearch(char *word, struct 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;
   }
/*b搜索:在选项卡[0]中查找单词…选项卡[n-1]*/
结构键*bin搜索(字符*word,结构键*tab,int n)
{
int-cond;
结构键*low=&tab[0];
结构键*高=&tab[n];
结构键*mid;
while(低<高){
中=低+(高-低)/2;
如果((cond=strcmp(word,mid->word))<0)
高=中;
否则如果(条件>0)
低=中+1;
其他的
中途返回;
}
返回NULL;
}
有两件事我不明白

首先,假设在这两种情况下,n都是结构数组的大小

在第一个binsearch中,
n-1
被描述为搜索的最高限制。匹配字符串实际上可以出现在
选项卡[high=n-1].word中,但不能出现在
选项卡[n].word中

在第二个binsearch中,最高限制写为
struct key*high=&tab[n]
,就好像字符串可能出现在那里,即使“取消引用”它是非法的(第138页,顶部)。它应该是一个
NULL
指针

为什么不将其写成
struct key*high=&tab[n-1]
?在c语言中,像这样的数组似乎总是让我感到困惑

我不明白的第二件事是

high=mid

在第二个binsearch中,与

high=mid-1

在第二项研究中


为什么第二个不是
high=mid-1
呢?

第一个问题的答案是,使用指针减法,你得到的是减去偏移量的结果,即如果
low=&tab[0]
high=&tab[n-1]
high-low
的结果是
n-1
。要获得中点,您需要
n
尽管(
n/2
),因此
high
应该等于
&tab[n]
。第二个问题的答案是mid始终比您感兴趣的元素高一个(因为我们知道它不是答案,而且它上面的所有元素都不是),因此它现在比您感兴趣的数组部分的末尾高一个。因此,第一个问题的逻辑适用,我们将高点放在数组“末端”的一点上

在第二个binsearch中,最上限写为struct key*high=&tab[n],就好像字符串可以出现在那里,即使“取消引用”它是非法的(第138页,顶部)。它应该是一个空指针

不,它将不是空指针。它将是指向数组末尾以外的第一个地址的指针。您不能取消引用高
,但可以在指针算法中使用它

为什么不写为struct key*high=&tab[n-1]

因为如果让
high
指向超过实际上限的一个元素,则该算法的计算结果更简单

为什么第二个不是高=中1呢

因为他们选择了
high
点一个元素超过实际上限。这只是为了保持一致


您可以像编写索引版本一样编写指针版本,其中高点指向实际元素,但您会发现需要在此处或此处进行
+1
-1
调整。他们选择这样做的方式消除了其中的大部分。

还有另一个密切相关的区别:
while(低