版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33487044/article/details/82155965
05结构体
结构体
struct point {
int x;
int y;
}
关键字 struct 引入结构声明。结构声明由包含在花括号内的一系列声明组成。关键字 struct 后面的名字是可选的,称为结构标记(这里是 point)。结构标记用于为结构体命名,在定义之后,结构标记就代表花括号内的声明。
struct 声明定义了一种数据类型。在标志结构成员表结束的花括号之后可以跟一个变量,这与其它基本类型的变量声明是相应的。例如
struct { ... } x,y,z;
这个声明将x、y、z 声明为指定类型的变量,并且为它们分配存储空间。如果结构声明后面不带变量表,则不需要为它分配存储空间。
struct point pt;
定义了一个 struct point 类型的变量 pt。结构的初始化可以在定义的后面使用初值表进行。初值表中同每个成员对应的初值必须是常量表达式,例如:
struct point maxpt = {320, 200};
或
maxpt.x = 320;
maxpt.y = 200;
在表达式中,可以通过下列形式引用某个特定结构中的成员:
结构名.成员
pt.x;
pt.y;
结构体雨人可以嵌套,如下
struct rect {
struct point pt1;
struct point pt2;
}
struct rect screen;
screen.pt1.x;
screen.pt2.y;
结构体与函数
通过三种可能的方法可以传递结构体:
- 分别传递各个结构体成员
- 传递整个结构体
- 传递指向结构体的指针
struct makepoint(int x, int y) {
struct point temp;
temp.x = x;
temp.y = y;
return temp;
}
makepoint(pt.x,pt.y);
struct makepoint(struct point p) {
struct point temp;
temp.x = p.x;
temp.y = p.y;
return temp;
}
makepoint(pt);
如果传递给函数的结构体很大,使用指针的方式传递结构体通常比复制整个结构体的效率要高。结构体指针类似于普通变量指针,声明
struct point *pp;
结构体指针引用成员变量
(*pp).x;
(*pp).y;
pp->x;
pp->y;
结构体数组
struct key {
char *word;
int count;
} keytab[NUM];
或
struct key keytab[NUM] = {
"auto",0,
"break",0,
"case",0,
"while",
};
指向结构的指针
struct point *pp;
(*pp).x;
(*pp).y;
pp->x;
pp->y;
自引用结构
struct node {
char *word;
int count;
struct node *left;
struct node *right;
};
类型定义(typedef)
C 语言提供一个称为 typedef 的功能,用来建立新的数据类型名,例如,声明
typedef int Length;
将 Length 定义为与 int 具有同等意义的名字。类型 Length 可用于类型声明、类型转换等,它和类型 int 完全相同,例如
Length len,maxLen;
Length *lengths[];
接下来,用 typedef 定义树节点
typedef struct node *TreePtr;
typedef struct node {
char *word;
int count;
struct node *left;
struct node *right;
} TreeNode;
上面的类型定义创建了两个新型类关键字:TreeNode(结构体)和 TreePtr(一个指向该结构体的指针)。
用 typedef 定义函数
typedef int (*PFI)(char *,char *);
该语句定义了类型 PFI 是「一个指向函数的指针,该函数具有两个 char * 类型的参数,返回值类型为 int」。
联合 Union