FILE*), ungetc(int, FILE*); char *wp = word; /*处理第一个字符, 第一个字符不是 空 不是 EOF 再进行下面的操作*/ while(isspace(c = getc(stdin))); if(c != EOF) *wp++ = c; if(!isalpha(c)) { *wp = ''; return c; } /*循环接收字符串, 字符串接收到非标识符 或者 到达个数上限停止循环*/ for(; --max > 0; wp++) if(!isalnum(*wp = getc(stdin))) { ungetc(*wp, stdin); break; } *wp = ''; return word[0]; } /* * 注意点 : * 取两个地址的中值 : 一个数组n个元素, 其中值计算 是由 首元素的首地址 和 尾元素的尾地址计算的 * 二分查找 : * 如果要把区间前移, 那么就需要将尾地址设置为 中间元素前一个元素的尾地址, 即中间元素的首地址 * 如果要把区间后移, 那么就需要将首地址设置为 中间元素后一个元素的首地址, 即中间元素 + 1 的地址 * * 指向结构体数组的指针 : * struct key tab * 是指向结构体数组指针, 该指针可以操作结构体数组 */ struct key *binsearch(char *word, struct key *tab, int n) { int cond; struct key *low = &tab[0]; /*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; /*mid 是 中间元素前一个元素的尾地址*/ else if(cond > 0) low = mid + 1; /*这里low要成为mid后一个元素的首地址*/ else return mid; } return NULL; }
执行结果 :
octopus@octopus-Vostro-270s:~/code/c/struct$ gcc pointer_struct.c
octopus@octopus-Vostro-270s:~/code/c/struct$ ./a.out
auto
case
auto
break
2 auto
1 break
1 case
(2) 结构体大小讨论
结构体数组指针算术运算 : struct key *p = word_count; 指针 p 指向 结构体数组, 如果 p + 1 , 结果是 p 地址 加上 结构体所占内存大小;
结构体大小 : 结构体的大小不是完全等于各个成员的长度之和, 对象之间有对齐要求;
-- 空穴 : 对象间对齐, 会产生空穴, 占有空间, 但是不存储数据;
示例 : 结构体中由一个 char 和 int , 占用的空间却是 8个字节, 它们的和是 5个字节;
/*************************************************************************
> File Name: memory_struct.c
> Author: octopus
> Mail: octopus_work.163.com
> Created Time: 2014年03月25日 星期二 12时55分45秒
************************************************************************/
#include
struct word
{
char c;
int i;
};
int main(int argc, char **argv)
{
printf(sizeof(struct word) = %d
, sizeof(struct word));
return 0;
}
执行结果 :
octopus@octopus-Vostro-270s:~/code/c/struct$ gcc memory_struct.c
octopus@octopus-Vostro-270s:~/code/c/struct$ ./a.out
sizeof(word) = 8
.
作者 : 万境绝尘
转载请注明出处 : http://www.hanshuliang.com/ post=30
.