当前位置:文档之家› C语言 第10章 结构类型与其他构造类型

C语言 第10章 结构类型与其他构造类型



结构体嵌套的完整定义
struct date { int year; int month; int day; }; struct student_info { char no[7]; char name[15]; char sex; struct date birthday; }
7.1.2
定义结构体类型变量的方法
例7.3指向结构体变量的指针的应用。
#include <string.h> main() {struct student {long num; char name[20]; char sex; float score; }; struct student stu-1; struct student * p; p=&stu-1; stu-1.num=8971; strcpy(stu-1.name,"Li Lin"); stu-1.sex='M'; stu-1.score=89.5; printf("No.:%ld\nname:%s\nsex:%c\nscore:%f\n",stu-1.num,,stu1.sex,stu-1.score); printf("No.:%ld\nname:%s\nsex:%c\nscore:%f\n",(*p).num,(*p).name, (*p).sex, (*p).score); }
7.1.4
结构体变量的初始化
结构体变量为全局变量或静态变量时,才能进行初 始化。初始化过程类似于数组。 结构体变量初始化的格式,与一维数组相似: 结构体变量={初值表} 不同的是:如果某成员本身又是结构体类型,则该成员的 初值为一个初值表。 例如,student={"00072", "张三", "男", {1980,9,20}}。
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]; }student1,student2;
7.3.2
指向结构体数组的指针
指针变量不仅可以指向一个结构体变量,也可以指向一 个结构体数组。
例7.4指向结构体数组的指针的应用。 struct student { int num; char name[20]; char sex; int age; }; struct student stu[3]={{7001,”Li lin”,’M’,18},{7002,“Zhangjun”,’M’,19}, {7003,”Wang Ming”,’F’,20}}; main( ) {struct student *p; printf(“ No. Name Sex Age\n”); for(p=stu;p<stu+3;p++) printf(“%5d %-20s %2c %4d \n”, p->num, p-); }
7.1.3 引用结构中的成员



在定义了结构体变量以后,当然可以引用这个变量 了,但要注意以下规则: (1) 不能将一个结构体变量作为一个整体进行输入 和输出。 例如:已定义了的person1和person2为结构体变量 并且它们已有值。不能这样引用: printf(“%s,%c,%ld,%f\n”,person1); 只能对结构变量中的各个成员分别进行输入和输出。 引用结构体变量中成员的方式(C 规定引用的形式) 为:结构体类型变量名.成员名 注意:”.”是成员运算符,它在所有的运算符中优 先级最高。
重点:结构体型变量、数组、指针变量的定义、赋值和成 员的引用方法。 难点:结构体型变量、数组及 指针变量
第7章 结构类型与其它构造类型

7.1 结构体类型


7.2 结构体数组
7.3 结构指针


7.4 共用体和枚举
7.5 位段简介

7.6 用typedef定义类型
7.1 结构体类型
为将不同数据类型、但相互关联的一组数 据,组合成一个有机整体使用,C语言提供一种 称为“结构体”的数据结构体。 例如,一个学生的学号、姓名、性别、年 龄、成绩、家庭住址等都与某一学生相联系。 如果将这些数据分别定义成互相独立的简单变 量,是很难反映它们之间内在联系的。倘若将 它们组织成一个组合项,则能更好地反映问题, 处理起来也很方便。
7.3
7.3.1
结构体指针
结构体变量在内存中的起始地址称为结构体变量的指针。
指向结构体变量的指针
一个结构体变量的指针就是该变量所占据内存段的起 始地址。可以设一个指针变量,用来指向一个结构体变量, 该指针变量的值就是结构体变量的起始地址。 例如:struct student *p1,student1; p1=&student1; 此时p1指向结构体变量student1的首地址。引用结构 体指针以后,可以有三种方式访问结构体变量的各个成员: ① 结构体变量名.成员名; 区别:p->n ② (*p).成员名; p->n++ ③ p->成员名 ++p->n
number
03040120
name
张三
sex

age
18
score
75.0
图7-1
struct student { int num; char name[20]; char sex; int age; float score; };
注意不要忽略最后的分号。
声明一个结构体类型的一般形式为: struct 结构体名 {成员表列}; “结构体名” 用作结构体类型的标志,它又称“结构体 标记”(structure tag) 。上面的结构体声明中student就是 结构体名(结构体标记)。大括弧内是该结构体中的各个成员, 由它们组成一个结构体。
例7.2 对候选人得票的统计程序。设有3个候选人,每次输入 一个得票的候选人的名字,要求最后输出各人得票结果。 #include <string.h> struct person 程序如下:
{ char name[20]; int count; } leader[3]={"Li",0,"Zhang",0,"Fun",0}; main() { int i,j; char leader-name[20]; for(i=1;i<=7;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); }
1、先声明结构体类型再定义变量名 法一: 法三: 2、在声明类型的同时定义变量 法二: struct struct struct student student struct 结构体名 { int num; { int int{ num; num; char name[20]; name[20]; { char char name[20]; char sex; 成员表列 char char sex; sex; int int age; int age; age; }变量名表列; char char addr[30]; char addr[30]; addr[30]; 3、直接定义结构类型变量 } }stu1,stu2 ; }; stu1,stu2; ; struct struct student stu1,stu2; { 成员表列 }变量名表列;
7.2 结构体数组
结构体数组的每一个元素,都是结构体类型数据,均 包含结构体类型的所有成员。
7.2.1 定义结构体数组
与结构体变量的定义相似,结构体数组的定义也分直接定 义和间接定义两种方法,只需说明为数组即可。
struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }; struct student stu[3];
第7章
结构类型与其它构造类型
本章的主要内容
1、三种新的复杂数据类型:结构体型、共用体型、枚举型 的概念与作用。 2、结构体的定义方法,结构体型变量、数组、指针变量的 定义、赋值和引用方法。 3、共用体的定义方法,共用体型变量的定义和使用。 4、枚举类型的定义方法,枚举类型变量的定义和引用方法。
本章的重点和难点
说明 ( 1 )结构体类型与结构体变量是两个不同的概念,其 区别如同int类型与int型变量的区别一样。 ( 2 )结构体类型中的成员名,可以与程序中的变量同 名,它们代表不同的对象,互不干扰。 (3) 对结构体中的成员(即“域”)可以单独使用,它的用 法相当于普通变量。 (4) 成员也可以是一个结构体变量。


(2) 如果成员本身又属于一个结构体变量, 则要用若干个成员运算符,一级一级找到最 低一级的成员。只能对最低级的成员进行赋 值或存取运算。例如结构体变量info1,可以 这样访问成员: info1.birthday.year 注意:不能用info1.birthday来访问info1变 量中的成员birthday,是因为birthday本身 就是一个结构体变量。
注意:初值的数据类型,应与结构体变量中相应成员所要 求的一致,否则会出错。
相关主题