C程序设计----结构体

来源:互联网 发布:安卓打开java闪退 编辑:程序博客网 时间:2024/05/17 10:29

一、与结构体相关的优先级

struct {        int      len;      char  *str;}*p;
首先要知道,在所有的运算符中,结构运算符 "."和 "->"、用于函数调用的 "()"、用于下标的 [ ] 的优先级最高。
++p->len;    /* 等同于++(p->len),增加len的值,而不增加p的值 */(p++)->len;  /* 先对len进行操作,然后对p进行加1     */*p->str;     /* 读取的是str所指向的对象的值         */*p->str++;   /* 先读取str指向的对象的值,再对str加1 */(*p->str)++; /* 将指针str指向的对象的值加1  */*p++->str;   /* 先读取str指向对象的值,然后再将p加1 */

二、指向结构的指针

struct key{        char  *word;      int      count;};struct key keytab[NKEYS];

1.条件编译语句 #if 中不能使用 sizeof ,因为预处理器不对类型名进行解析;
   但预处理器并不计算 #define 语句中的表达式,因此在 #define 中使用 sizeof 是合法的。
   例如:
#define NKEYS (sizeof keytab / sizeof(struct key))//或者#define NKEYS (sizeof keytab / sizeof(keytab[0]))

2.指向同一个结构体的两个指针的中间值的计算问题:
  
struct key *low = &keytab[0];struct key *low = &keytab[n]; //假设n=NKEYSstruct key *mid;
首先说明,C语言的定义保证数组末尾之后的第一个元素的指针算数运算是可以正确执行的,但对该指针的间接引用是非法的。
正确:mid = low + (high-low) / 2;  因为两个指针之间的加法是非法的。
错误:mid = (low + high) / 2;          两个指针之间的减法是合法的。
3.结构的长度不等于各个成员长度的和,因为不同的对象有不同的对齐要求,所以结构体中可能出现“空穴”(hole)。
 例如:
struct {    char c;    int    i;};
假设 char 类型占一个字节,int 类型占4个字节,则结构可能需要8个字节的存储空间,而不是 5 个字节。用 sizeof 可以返回正确的对象长度。




0 0
原创粉丝点击