结构定义

结构是一个或多个变量的集合,这些变量可能为不同的类型。

1
2
3
4
struct point {
int x;
int y;
};

关键字 struct 引入结构声明。结构中定义的变量称为成员。

struct 声明定义了一种数据类型,可以使用它声明变量。

1
2
3
struct {...} x, y, z;
// 语法上说与下面方式具有类似的意义。
int x, y, z;

上面这两种声明都将 x, y, z 声明为指定类型的变量,并且为它们分配存储空间。

如果结构声明的后面不带变量表,则不需要为它分配存储空间。还可以使用如下方式声明变量:

1
2
struct point pt;
struct point maxpt = {320, 200};

可以通过下列形式引用某个特定结构中的成员:结构名.成员

1
2
3
printf("%d,%d", pt.x, pt.y);
double dist, sqrt(double);
dist = sqrt((double)pt.x * pt.x + (double)pt.y * pt.y);

结构是可以嵌套的。

1
2
3
4
struct rect {
struct point pt1;
struct point pt2;
};

结构与函数

结构的合法操作只有几种:

  • 作为整体复制和赋值
  • 通过 & 运算取地址
  • 访问其成员

看如下一个函数例子:

1
2
3
4
5
6
7
struct point makepoint(int x, int y)
{
struct point temp;
temp.x = x;
temp.y = y;
return temp;
}

函数 makepoint 接受两个整形参数,返回一个 point 结构。

结构指针类似于普通指针:

1
struct point *pp;

将 pp 定义为一个指向 struct point 类型对象的指针。那么 pp 是该结构,(pp).x 和 (*pp).y 则是结构成员。

由于结构指针使用频度高,C 语言提供了简便写法。假定 p 是指向结构的指针,可以用:

1
2
3
p->结构成员
// 上面的例子可以改称
pp->x,pp->y

结构数组

结构数组可以进行如下声明:

1
2
3
4
struct key {
char *word;
int count;
} keytab[NKEYS];

上面的声明也可以写成这样:

1
2
3
4
5
struct key {
char *word;
int count;
};
struct key keytab[NKEYS];

当然在定义的时候也可以进行初始化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct key {
char *word;
int count;
} keytab[] = {
"auto", 0,
"break", 0,
"case", 0,
"while", 0
};

struct key {
char *word;
int count;
} keytab[] = {
{"auto", 0},
{"break", 0},
{"case", 0},
{"while", 0}
};

【参考资料】

  1. C程序设计语言

—EOF—