logo.gif (2828 bytes)
logo1.gif (253 bytes)
pageup.jpg (7897 bytes)firstpage.jpg (7734 bytes)pagedown.jpg (7767 bytes)

第九章 结构体和公用体

§9.1 概述

C语言提供了这样一种数据结构,它称为结构体。例如:

struct student

{ int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

};

定义一个结构体的一般形式为:

struct 结构体名

{类型标识符1 成员名1;

 类型标识符2 成员名2;

         :

 类型标识符n 成员名n;};

 

§9.2 定义结构体和共用体变量的方法

要定义一个结构体类型的变量,可以采取以下三种方法。

一、先定义结构体类型再定义变量名

如:struct student student1student2[3],*p

二、在定义类型的同时定义变量

例如:struct student

{ int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

}student1student2[3],*p;

三、直接定义结构类型变量

例如:struct

{ int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

}student1student2[3],*p;

关于结构体类型,有几点要说明:

  1. 类型与变量是不同的概念,对结构体变量来说,在定义是一般先定义一个结构体类型,然后定义变量为该类型。只能对变量赋值、存取或运算,而对一个类型却不能。
  2. 对结构体的成员,可以单独使用,他的作用与地位相当于普通变量。
  3. 成员也可以是一个结构体变量。
  4. 成员名可以与程序中的变量名相同。

§9.3 结构体变量的引用

9.3.1对结构体成员的引用

可用以下三种形式引用结构体变量中的成员:

(1)结构体变量名.成员名

(2)指针变量名-〉成员名

(3)(*指针变量名).成员名

§9.4 结构体变量的初始化

一、对外部存储类型的结构体变量进行初始化。

struct student

{ long int num;

char name[20];

char sex;

char addr[30];

}a={89031, "Li Lin",'M', "130 Beijing Road"};

 main( )

{ printf("No.:%ld\n name:%s\n sex:%c\n,address:%s\n",a.num,a.name,a.sex,a.addr);}

运行结果如下:

No.:89031

name:Li Lin

sex: M

address:130 Beijing Road

二、对静态存储类型的结构体变量进行初始化。定义部分也可以放到 main 函数中。

main( )

{ struct student

{ long int num;

char name[20];

char sex;

char addr[30];

}a={{89031, "Li Lin",'M', "130 Beijing Road"};

printf("No.:%ld\n name:%s\n sex:%c\n address:%s\n",a.num,a.name,a.sex,a.addr);

}

三、结构体数组的初始化。

结构体数组只能对全局和静态存储类别的数组初始化。如:

struct student

{ int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

}stu[3] = {{10101, "Li Lin",'M',19,99, "130 ShangHai Road"},{10104, "Wang Min",'F',20,78.5,"Zhongshan Road"} };

 

四、举例。

例:对候选人得票的统计程序。设有三个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。

struct person

{ char name[20];

int count;

}leader[3]={ "Li", 0, "Zhang",0, "Fun",0 };

void main(void)

{ int i,j;

char leader_name[20];

for (i=1;i<=10;i++)

{ scanf("%s",leader_name);

for (j=0;j<3;j++)

if (strcmp(leader_name,leader[j].name) = = 0) leader[j].count++;

}

printf("\n");

for(i=0;i<3;i++)

printf("%5s:%d\n",leader[i].name,leader[i].count);

}

运行情况如下:

Li

Li

Fun

Zhang

Zhang

Fun

Li

Fun

Zhang

Li

Li4

Zhang3

Fun3

§9.5 共用体变量的引用方式

一、共同体的概念

    有时需要将几种不同类型的变量存放到同一段内存单元中。这种使几个不同的变量共占同一段内存的结构,称为“共同体”类型的结构。

“共同体”类型变量的定义形式为:

union 共同体名

{ 成员表列

}

变量表列;也可以将类型定义与变量定义分开或者直接定义共同体变量。

例如:下面是几种定义的方式

1. union data            2. union data               3. union

{ int i;                   { int i;                    { int i;

char ch;                    char ch;                     char ch;

float f;                    float f;                     float f;

} a,b,c;                     };                         } a,b,c;

                            union data a,b,c

二、共同体变量的引用方式

与结构体相同

§9.6 枚举类型

    如果一个变量只有几种可能的值,可以定义为枚举类型。所谓“枚举”是指将变量的值一一列举出来。变量的值只限于列举出来的值的范围内。

定义枚举类型用enum开头。

例如:enum weekday {sun,mon,tue,wed,thu,fri,sat};

定义了一个枚举类型enum weekday

可以用此类型来定义变量。如:enum weekday workday, week_end;

workdayweek_end被定义为枚举类型,它们的值只能是sunsat之一。例如:

workday = mon;

week_end = sun; 是正确的。

说明:

  1. C编译中,对枚举元素按常量处理,故称枚举常量。枚举元素作为常量,它们是有值的。 C语言编译按定义时的顺序使它们的值为012┅。 同时也可以定义它们的值,如:enum color {red=1,blue=3,green}.其中green自动为4。

  2. 枚举值可以用来作为判断比较。如:if(workday= =mon) ┅枚举值比较规则是:按其在定义时的顺序号比较。如果定义时没有指定,则第一个枚举元素的值认作0。故mon>sun.

  3.一个整数直接赋给一个枚举变量是不对的。如:workday = 2,应先进行强制类型转换才能赋值。如:workday=(enum weekday) 2;

§9.7 typedef来定义数据类型

我们可以用typeof定义新的类型名代替已有的类型名。

如:typedef int INTEGER; 指定用INTEGER代表int类型。这样 int i,j;等价于 INTEGER i,j;

如果在一个程序中,一个整型变量用来计数,可以将变量定义为 COUNTint 型:

typedef int COUNT;

COUNT i,j;

定义一个新的类型的方法是:

1. 先按定义变量的方法写出定义体(如:int i;)。

2. 将变量名换成新类型名(如:将 i换成COUNT)。

3. 在最前面加 typedef(如: typedef int COUNT;)。

4. 然后可以用新类型名定义变量。

说明:

  1. typedef 可以定义各种类型名,但不能用来定义变量。
  2. typedef只是对已经存在的类型增加了一个类型名并没有创造新的类型。
  3. typedef #define有相似之处,但#define只能作简单的字符串替换,而typedef是采用定义变量的方法定义一个类型。
  4. 当不同的源文件用到同一数据类型(像结构体、共同体)时,常用typedef定义一些数据类型,把它们单独放到一个文件中,需要它们时用 #define把它们包含进来。