2.2结构体类型的变量、数组和指针变量的定义
可以用以下四种方式定义结构体类型的变量、数组和指针变量:
(1)紧跟在结构体类型说明之后进行定义。例如:
struct student
{
char name[12];
char sex;
struct date birthday;
float sc[4];
} std, pers[3], *pstd;
此处,在说明结构体类型 struct student 的同时,定义了一个结构体变量 std、有3个变量的结构体数组 pers 和基类型为结构体类型的指针变量 pstd。
(2)在说明一个无名结构体类型的同时,直接进行定义。如:上述定义的结构体中可以把 student 省略,写成:
struct
{...
} std, pers[3], *pstd;
这种方式与前一种的区别仅仅是省略了结构体标识名,通常用在不需要再次定义此类型结构体变量的情况。
(3)先说明结构体类型,再单独进行变量定义。如:
struct student
{...
};
struct student std, pers[3], pstd;
此处,先说明了结构体类型 struct student,再由一条单独的语句定义变量 std、数组 pers 和指针变量 pstd。使用这种定义方式应注意:关键字 struct 必须和结构体标识名 student 共同说明结构体类型。
(4)使用 typedef 说明一个结构体类型名,再用新类型名来定义变量。如:
typedef struct
{
char name[12];
char sex;
struct date birthday;
float sc[4];
} STREC;
STREC std, pers[3], *pstd;
STREC 是一个具体的结构体类型名,它能够唯一地标识这种结构体类型。因此,它可以用来定义变量,如同使用 int 、char 一样,不可再写关键字 struct。
2.3 给结构体变量、数组赋初值
和一般变量、数组一样,结构体变量和数组也可以在定义的同时赋初值。
2.3.1 给结构体变量赋初值
所赋初值放在一对花括号中,如:
struct student
{
char name[12];
char sex;
struct date birthday;
float sc[4];
} std = {"Li Ming", ‘M’, 1997, 5, 10, 88.0, 76.0, 85.5, 90.0};
赋初值后,变量 std 内容如图所示:
name sex birthday sc[0] sc[1] sc[2] sc[3]
year month day
Li Ming | M | 1997 | 5 | 10 | 88.0 | 76.0 | 85.5 | 90.0 |
对结构体变量赋值时,C 编译程序按每个成员在结构中的顺序一一对应赋初值,不允许跳过前面的成员给后面的成员赋初值。但可以只给前面的若干成员赋初值,对后面未赋初值的成员,系统将自动为数值型和字符型数据赋初值0。
2.3.2 给结构体数组赋初值
由于数组中每个元素都是一个结构体,因此通常将其成员的值依次放在一对花括号中,以便区分各个元素。
struct bookcard
{
char num[5];
float money;
} bk[3] = { {"NO.1", 35.5}, {"NO.2", 25.0}, {"NO.3", 66.7} };
/* bk[0] bk[1] bk[2] */
也可以通过这种赋初值的方式,隐含确定结构体数组的大小。即:由编译程序根据所赋初值的成员个数决定数组元素的个数。以下是一个给二维数组赋初值的例子:
struct
{
char ch;
int i;
float x;
} arr[2][3] = {
{ {"a", 1, 3.0e10}, {"a", 2, 4.0e10}, {"a", 3, 5.0e10} }, /*第一行*/
{ {"b", 1, 6.0e10}, {"b", 2, 7.0e10}, {"b", 3, 8.0e10} } /*第二行*/
};
根据花括号的嵌套关系,可以清楚的分辨出所赋初值与数组元素一一对应的关系。
2.3.3 相同类型结构体变量之间的整体赋值
ANSI C 标准允许相同类型的结构体变量之间进行整体赋值。如:
struct
{
char name[10];
int num;
} per1, per2 = {"Jhon", 46};
执行赋值语句:per1 = per2; 则 per2 中每个成员的值都赋给了 per1 中对应的同名成员。这种赋值方法必须要保证赋值号两边结构体变量的类型相同。