指向结构的指针.doc_第1页
指向结构的指针.doc_第2页
指向结构的指针.doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

指向结构的指针为了进一步说明指向结构的指针和结构数组,我们重新编写关键字统计程序,这次采用指针,而不使用数组下标。keytab的外部声明不需要修改,但main和binsearch函数必须修改。修改后的程序如下:#include #include #include #define MAXWORD 100int getword(char *, int);struct key *binsearch(char *, struct key *, int);/* count C keywords; pointer version */main()char wordMAXWORD;struct key *p;while (getword(word, MAXWORD) != EOF)if (isalpha(word0)if (p=binsearch(word, keytab, NKEYS) != NULL)p-count+;for (p = keytab; p count 0)printf(%4d %sn, p-count, p-word);return 0;/* binsearch: find word in tab0.tabn-1 */struct key *binsearch(char *word, struck key *tab, int n)int cond;struct key *low = &tab0;struct key *high = &tabn;struct key *mid;while (low word) 0)low = mid + 1;elsereturn mid;return NULL;这里需要注意几点。首先,binsearch函数在声明中必须表明:它返回的值类型是一个指向struct key 类型的指针,而非整型,这在函数原型及binsearch 函数中都要声明。如果binsearch找到与输入单词匹配的数组元素,它将返回一个指向该元素的指针,否则返回NULL。其次,keytab的元素在这里是通过指针访问的。这就需要对binsearch做较大的修改。在这里,low和high的初值分别是指向表头元素的指针和指向表尾元素后面的一个元素的指针。这样,我们就无法简单地通过下列表达式计算中间元素的位置:mid = (low+high) / 2 /* WRONG */这是因为,两个指针之间的加法运算是非法的。但是,指针的减法运算却是合法的,high-low的值就是数组元素的个数,因此,可以用下列表达式:mid = low + (high-low) / 2将mid设置为指向位于high和low之间的中间元素的指针。对算法的最重要修改在于,要确保不会生成非法的指针,或者是试图访问数组范围之外的元素。问题在于,&tab-1和&tabn都超出了数组tab 的范围。前者是绝对非法的,而对后者的间接引用也是非法的。但是,C 语言的定义保证数组末尾之后的第一个元素(即&tabn)的指针算术运算可以正确执行。主程序main中有下列语句:for (p = keytab; p keytab + NKEYS; p+)如果p 是指向结构的指针,则对p 的算术运算需要考虑结构的长度,所以,表达式p+执行时,将在p 的基础上加上一个正确的值,以确保得到结构数组的下一个元素,这样,上述测试条件便可以保证循环正确终止,但是,千万不要认为结构的长度等于各成员长度的和。因为不同的对象有不同的对齐要求,所以,结构中可能会出现未命名的“空穴“(hole)。例如,假设char类型占用一个字节,int类型占用4 个字节,则下列结构:struct char c;int i;可能需要8 个字节的存储空间,而不是5 个字节。使用sizeof 运算符可以返回正确的对象长度。最后,说明一点程序的格式问题:当函数的返回值类型比较复杂时(如结构指针),例如struct key *binsearch(char *word, struct key *tab, int n)很难看出函数名,也不太容易使用文本编辑器找到函

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论