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