当前位置:文档之家› 第十一章结构体和共用体

第十一章结构体和共用体

三种方法:
一、先定义结构体类型再定义结构体变量

struct 结构体类型名
{ 类型标识符 成员名;
:
类型标识符 成员名;
};
struct 结构体类型名 变量名1,变量名2...;
例如:struct student { char number[10]; char name[20]; char sex; int age; float score[20]; char addr[30]; }; struct student x1,x2;
程序如下: struet person { char name[20]; int count; } leader[3]={"Li", o,"Zhang" , o, " Fang ", o};
main ( ) {int i, j;
chr leader_name[20]; for (i=1; i<=10; i++)
• printf("%ld %-15s %3c %6d %6.2f\n",student[i].num,student[i].name,

student[i].sex,student[i].age,student[i].score);
•}
第四节 结构体变量的初始化
与其它变量的初始化完全一样,结构体变量在定 义时可初始化:
3、用“&”运算符可以取结构体变量的首地址 和某个成员的首地址。例如:
printf(“%d\n”,&stud); scanf(“%c\n”,&stud.sex);
scanf(“%d\n”,&stud.birthday.month);
对数组成员的首地址,可以省略地址运算符, 如:
scanf(“%s”,);
stud[1].name, stud[1].age, stud[1].score);
例:有三个侯选人,每一侯选人的数据包括其姓名和 得票数,则可定义结构类型person和结构数组leader
struct person { char name[20]; int count; } leader[3]={"Li", o,"Zhang" , o, " Fang ", o};
4、对成员变量可以象普通变量一样进行各种运 算,例如:
sum=stud.score[0]+ stud.score[1]+ stud.score[2]
结构体变量的输入和输出
• C语言不允许把一个结构体变量作为一个整体进行输入或输 出的操作。例如: struct { long num; char name[20]; } stud;
上述定义中: struct ––– 关键词(保留字), 表示定义一种结
构体类型。
strudent –––结构体名, 相当于类型名(int, float等)
其一般形式: struct 结构体名 {成员表列};
成员表列:类型标识符 成员名
以上仅说明了定义一种类型的方法,尚未定 义变量。
第二节 定义结构体变量
1. 类型名与变量名是不同的概念 2. 允许成员名又为另一个已定义的结构型变量 3. 每一个成员地位如同该类型的变量 4. 成员名与程序中的变量名可相同但意义不同
一个嵌套定义的例子:
struct date { int month; int day; int year; }
struct student {int num; char name[20]; char sex; int age; struct date birthday; char addr[30]; } x1, x2;
• main()
• { struct stud student[3];
• int i; char ch; char numstr[20];
• for(i=0;i<3;i++)
• {gets(numstr); student[i].num=atol(numstr);
• gets(student[i].name);
int age;
float score; };
struct student stud[3];
结构体数组在内存中的存储:
(1)按数组下标由小到大 (2)在给每个数组元素的空间内再按
照成员的顺序连续存放。
stud[0] 9701,"liMing",20,98 stud[1] 9702, "WangDan", 20,95 stud[2] 9703, "LiHui", 19,80
第十一章 结构体与共用体
第一节 结构体及其类型定义
数组––– 同种数据类型的集合 实际问题中:存在不同类型的数据构成的集合。
例:建立学生档案 每一个学生:学号(int num) 姓名(char name[20]) 性别(char sex) 年龄(int age)
成绩(float score) 地址(char addr[30]) 可将上述数据的集合定义为一种结构体类型: struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }
}
运行情况如下: Li Li Fun Zhang Zhang Fun Li Fun Zhang Li
name Li Zhang Fun
count 0 0 0
Li : 4 Zhang : 3 Fun : 3
• 一个结构体的成员名字不能相同,但两个结构 体中可以使用同名成员,成员名也可以与程序 中的变量名相同,二者代表不同的对象;
• 成员也可以是一个结构体变量(嵌套)。
第五节 结构体数组
同数组定义类似
定义
方法一
先定义结构体类型,再定义结构体数组。
struct student
{ long num;
char name[20];程序运行结果 如下:128 a b
i=128,ch1=a,ch 2=b
• printf("i=%d,ch1=%c,ch2=%c\n",i,ch1,ch2);
•}
• 输入示例2:输入3个学生的信息并输出。 • #include "stdlib.h" • #include "stdio.h" • struct stud • { long num; • char name[20]; • char sex; • int age; • float score; • };
}
2、尽量避免用一个scanf函数输入包含字符数 据在内的一组不同类型的数据,以免出错。 处理办法:各种数据都用gets函数输入,然 后再用转换函数进行转换:
– atoi() 将字符串转换成整型
– atof() 将字符串转换成double型实数
– atol() 将字符串转换成长整型
• 这三个函数要用#include命令将“stdlib.h” 文件包含进来。
main()
{struct {int i; char ch1;
输入125 a b 运行结果?
char ch2;
i=125,ch1= ,ch2=a
}tt;
scanf(“%d%c%c”,&tt.i,&tt.ch1,&tt.ch2);
printf(“i=%d,ch1=%c,ch2=%c”,tt.i,tt.ch1,tt.ch2);
9701 LiMing 20 98 9702 WangDan 20 95 9703 LiHui 19 80
初始化
struct student { long num; char name[20]; int age; float score;
}stud[3]={{9701,"liMing",20,98}, {9702, "WangDan",20,95}, {9703, "LiHui",19,80}};
• student[i].sex=getchar(); ch=getchar();
• gets(numstr); student[i].age=atoi(numstr);
• gets(numstr); student[i].score=atof(numstr); }
• for(i=0;i<3;i++)
不允许 scanf("%d",&stud); printf("%d",stud);
可以用 scanf("%ld%s",&stud.num,); printf("%ld,%s", stud.num, );
注意:
1、由于结构体是由不同类型成员组成的,所以在用scanf函 数输入不同类型数据时有时会出现预料不到的事情,例如:
:
类型标识符 成员名;
}变量名1,变量名2,...;
struct student { char number[10];
char name[20]; char sex; int age; float score[20]; char addr[30]; }x1,x2;
三、直接定义结构类型变量
利用无名结构体类型定义变 量。
struct { 类型标识符 成员名;
: 类型标识符 成员名; }变量名1,变量名2,......;
struct { char number[10]; char name[20]; char sex; int age; float score[20]; char addr[30]; }x1,x2;
相关主题