指向结构指针

指向结构指针

ID:24022252

大小:27.50 KB

页数:2页

时间:2018-11-12

指向结构指针_第1页
指向结构指针_第2页
资源描述:

《指向结构指针》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、指向结构的指针为了进一步说明指向结构的指针和结构数组,我们重新编写关键字统计程序,这次采用指针,而不使用数组下标。keytab的外部声明不需要修改,但main和binsearch函数必须修改。修改后的程序如下:#include#include#include#defineMAXWORD100intgetword(char*,int);structkey*binsearch(char*,structkey*,int);/*countCkeywords;pointerversion*/main(){charword[MAX

2、WORD];structkey*p;while(getword(word,MAXWORD)!=EOF)if(isalpha(word[0]))if((p=binsearch(word,keytab,NKEYS))!=NULL)p->count++;for(p=keytab;pcount>0)printf("%4d%s",p->count,p->word);return0;}/*binsearch:findwordintab[0]...tab[n-1]*/structkey*binsearch(char*word,struc

3、kkey*tab,intn){intcond;structkey*low=&tab[0];structkey*high=&tab[n];structkey*mid;while(lowword))<0)high=mid;elseif(cond>0)low=mid+1;elsereturnmid;}returnNULL;}这里需要注意几点。首先,binsearch函数在声明中必须表明:它返回的值类型是一个指向structkey类型的指针,而非整型,这在函数原型及binse

4、arch函数中都要声明。如果binsearch找到与输入单词匹配的数组元素,它将返回一个指向该元素的指针,否则返回NULL。其次,keytab的元素在这里是通过指针访问的。这就需要对binsearch做较大的修改。在这里,low和high的初值分别是指向表头元素的指针和指向表尾元素后面的一个元素的指针。这样,我们就无法简单地通过下列表达式计算中间元素的位置:mid=(low+high)/2/*WRONG*/这是因为,两个指针之间的加法运算是非法的。但是,指针的减法运算却是合法的,high-low的值就是数组元素的个数,因此,可以用下列表达式:mid=low+(high-lo

5、w)/2将mid设置为指向位于high和low之间的中间元素的指针。对算法的最重要修改在于,要确保不会生成非法的指针,或者是试图访问数组范围之外的元素。问题在于,&tab[-1]和&tab[n]都超出了数组tab的范围。前者是绝对非法的,而对后者的间接引用也是非法的。但是,C语言的定义保证数组末尾之后的第一个元素(即&tab[n])的指针算术运算可以正确执行。主程序main中有下列语句:for(p=keytab;p

6、到结构数组的下一个元素,这样,上述测试条件便可以保证循环正确终止,但是,千万不要认为结构的长度等于各成员长度的和。因为不同的对象有不同的对齐要求,所以,结构中可能会出现未命名的“空穴“(hole)。例如,假设char类型占用一个字节,int类型占用4个字节,则下列结构:struct{charc;inti;};可能需要8个字节的存储空间,而不是5个字节。使用sizeof运算符可以返回正确的对象长度。最后,说明一点程序的格式问题:当函数的返回值类型比较复杂时(如结构指针),例如structkey*binsearch(char*word,structkey*tab,intn)很难

7、看出函数名,也不太容易使用文本编辑器找到函数名。我们可以采用另一种格式书写上述语句:structkey*binsearch(char*word,structkey*tab,intn)具体采用哪种写法属于个

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。