/*循环接收字符串, 字符串接收到非标识符 或者 到达个数上限停止循环*/
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;
}
</STRING.H></CTYPE.H></STDIO.H>
执行结果 :
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个字节;
#include<STDIO.H>
struct word
{
char c;
int i;
};
int main(int argc, char **argv)
{
printf(sizeof(struct word) = %d
, sizeof(struct word));
return 0;
}
</STDIO.H>
执行结果 :
octopus@octopus-Vostro-270s:~/code/c/struct$ gcc memory_struct.c
octopus@octopus-Vostro-270s:~/code/c/struct$ ./a.out
sizeof(word) = 8