结构(注意 最后的分号!!!)
struct point
{
int x;
int y;
};
关键字struct引入结构声明,struct后面的名字是可选的.称为结构标记(这里是point).如果结构声明的后面不带变量表,则不需要为它分配存储空间,它仅仅描述了一个结构的模板或轮廓.但是,如果结构声明中带有标记,那么在以后的定义结构实例时应该使用该标记定义.如:
struct point pt;//定义了一个struct point 类型的变量pt.
struct point *pt;
pt->x;
结构数据:
struct key
{
char *word;
int count;
}keytab[NKEYS];
它声明了一个结构类型key,并定义了该类型的结构数据keytab,同时为其分配存储空间,数据keytab的每个元素都是一个结构.
NKEYS代表keytab中关键字的个数.
#define NKEYS (sizeof keytab / sizeof(keytab[0]))
自引用结构
二叉树:
struct tnode
{
char *word;
int count;
struct tnode *left;
struct tnode *right;
};
一个包含其自身实例的结构是非法的.但是下列声明是合法的:
struct tnode *left;
它将left声明为指向tnode 的指针,而不是tnode实例本身.
typedef
typedef int (*PEI)(char *,char*);
该语句定义了类型PEI是"一个指向函数的指针,该函数具有两个char *类型的函数,返回值类型为int"
位字段:
常用方法:
1: #define KEYWORD 01
#define EXTRENAL 02
#define STATIC 04
或:
enum{KEYWORD =01,EXTERNAL = 02,STATIC =04}
这些数字都必须是2的幂.这样,访问这些位就变成了移位运算,屏蔽运算及补码运算进行简单的位操作.
2: C语言中的位字段(bit-field),或简称字段,是"字"中相邻位的集合,"字"(word)是单个的存储单元
struct
{
unsigned int is_keyword : 1;
unsigned int is_exetern :1;
unsigned int is_static : 1;
}flags;
这里变量flags包含3个一位的字段,冒号后的数据表示字段的宽度(用二进制位数表示).字段被声明为unsigned int 类型,以保证它们是符号量.