null第11章 结构体与共用体第11章 结构体与共用体11.1 概述
11.2 结构体变量的定义
11.3 结构体变量的引用
11.4 结构体变量的初始化
11.5 结构体数组
11.6 指向结构体类型数据的指针
11.7 链表
11.8 共用体
11.9 枚举类型
11.10 用typedef定义类型11.1 概述11.1 概述一个学生的信息有学号、姓名、性别、年龄、住址、成绩等。
一个教师的信息有职工编号、姓名、性别、年龄、职称、工资等。
如何描述这些类型不同的相互联系的数据?
用前面学过基本数据类型(如整型、实型、字符型等)或者数组都无法反映他们之间的联系。
-----结构体类型结构体是一种构造数据类型
用途:把不同类型的数据组合成一个整体-------自定义数据类型null结构体类型定义struct [结构体名]
{
类型标识符 成员名;
类型标识符 成员名;
…………….
};成员类型可以是
基本型或构造型struct是关键字,
不能省略合法标识符
可省:无名结构体此处的分号不能少null例 struct student
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}; 结构体类型定义结构体名是用户定义的任何一个有效的标识符,例子中struct student的作用就如同任何一个基本类型名,利用它能够定义具有该结构类型的变量或函数
描述了结构体类型的组织形式,不分配内存11.2 结构体变量的定义11.2 结构体变量的定义先定义结构体类型,再定义结构体变量
一般形式: struct 结构体名
{
类型标识符 成员名;
类型标识符 成员名;
…………….
};
struct 结构体名 变量名表列;例
struct student
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
struct student stu1,stu2; 例
#define STUDENT struct student
STUDENT
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
STUDENT stu1,stu2; null定义结构体类型的同时定义结构体变量
一般形式:struct 结构体名
{
类型标识符 成员名;
类型标识符 成员名;
…………….
}变量名表列;例 struct student
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}stu1,stu2; null直接定义结构体变量
一般形式:struct
{
类型标识符 成员名;
类型标识符 成员名;
…………….
}变量名表列;例 struct
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}stu1,stu2; 用无名结构体直接定义变量,不能在别的地方定义变量(少用)null说明
结构体类型与结构体变量概念不同
类型:不分配内存; 变量:分配内存
类型:不能赋值、存取、运算; 变量:可以
结构体可嵌套,即结构体的成员也可以是结构体
结构体成员可以单独使用,其作用与地位等用于普通变量,引用
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
见下节
结构体成员名与程序中变量名可相同,不会混淆11.3 结构体变量的引用11.3 结构体变量的引用引用
规则
编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf
单独引用结构体变量的成员
对结构体变量的成员可以像普通变量一样进行各种运算成员(分量)运算符
优先级: 1
结合性:从左向右引用方式: 结构体变量名.成员名由于“.”运算符的优先级最高,因此stu1.age++相当于(stu1.age)++11.3 结构体变量的引用11.3 结构体变量的引用引用规则
单独引用结构体变量的成员结构体变量不可以作为整体进行输入输出,以下两种情况结构体变量可以作为一个整体引用
相同类型的结构体变量可以赋值
结构体变量作为函数的参数或返回值时可以被整体引用结构体嵌套时逐级引用11.4 结构体变量的初始化11.4 结构体变量的初始化定义变量的同时给变量赋值struct 结构体名
{
类型标识符 成员名;
类型标识符 成员名;
…………….
};
struct 结构体名 结构体变量={初始数据};例 struct student
{ int num;
char name[20];
char sex;
int age;
char addr[30];
};
struct student stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”};nullstruct 结构体名
{
类型标识符 成员名;
类型标识符 成员名;
…………….
}结构体变量={初始数据};例 struct student
{ int num;
char name[20];
char sex;
int age;
char addr[30];
}stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”}; 11.5 结构体数组11.5 结构体数组结构体数组的定义
三种形式:形式一:
struct student
{ int num;
char name[20];
char sex;
int age;
};
struct student stu[2];形式二:
struct student
{ int num;
char name[20];
char sex;
int age;
}stu[2];形式三:
struct
{ int num;
char name[20];
char sex;
int age;
}stu[2];null结构体数组初始化顺序初始化:
struct student
{ int num;
char name[20];
char sex;
int age;
};
struct student stu[ ]={100,“Wang Lin”,‘M’,20,
101,“Li Gang”,‘M’,19,
110,“Liu Yan”,‘F’,19}; null结构体数组引用
结构体数组元素相当于一个结构体变量引用方式: 结构体数组名[下标].成员名 struct student
{ int num;
char name[20];
char sex;
int age;
}stu[3];stu[1].age++;strcpy(stu[0].name,”ZhaoDa”);null 例11.2 设有3个候选人,最终只能有1人当选。今有10个人参加投票,从键盘先后输入这10个人所投的候选人的名字,要求最后输出这3个候选人的得票结果。#include
#include
struct person
{ char name[20];
int count;
} leader[3]={“Li”,0,“Zhang”,0,”Wang“,0};结构体数组应用举例null统计候选人选票void main()
{ int i,j;
char leader_name[20];
for (i=0; i<10;i++)
{ scanf("%s",leader_name);
for(j=0;j<3;j++)
if(strcmp(leader_name,leader[j].name)==0)
leader[j].count++;
}
for(i=0;i<3;i++)
printf("%s\t%d\n",leader[i].name,leader[i].count);
}输出3个候选人的姓名与得票数通过比较姓名来统计票数,字符串的比较要用函数11.6 指向结构体类型数据的指针11.6 指向结构体类型数据的指针指向结构体变量的指针
定义形式:struct 结构体名 *结构体指针名;
例 struct student *p;使用结构体指针变量引用成员存放结构体变量在内存的起始地址指向运算符
优先级: 1
结合方向:从左向右例 int n;
int *p=&n;
*p=10; n=10struct student stu1;
struct student *p=&stu1;
stu1.num=101; (*p).num=101null例11.3 指向结构体变量的指针变量......
void main()
{ struct student
{ long int num;
char name[20];
char sex;
float score;
}stu_1,*p;
p=&stu_1;
stu_1.num=89101;
strcpy(stu_1.name,"Li Lin");
p->sex='M'; p->score=89.5;
printf("\nNo:%ld\nname:%s\nsex:%c\nscore:%f\n",
(*p).num,p->name,stu_1.sex,p->score);
}结构体成员的三种表示方法:① 结构体变量.成员名。如:stu.num
② (*p).成员名。如:(*p).num
③ p->成员名。如:p->num。p->num
p->num++
++p->num请分析以下几种运算:得到p指向的结构体变量中的成员num的值。
得到p指向的结构体变量中的成员num的值,用完该值后使它加1。 表达式的值是加1之前的值(p->num)++ 。
使p指向的结构体变量中的成员num的值加1,然后再使用它。表达式的值是新的值即加1之后的值++(p->num) 。结构体成员的三种表示方法:null指向结构体数组的指针例11.4 指向结构体数组的指针#include
struct student
{ int num;
char name[20];
char sex;
int age;
}stu[3]={{10101,"Li Lin",'M',18},
{10102,"Zhang Fun",'M',19},
{10104,"Wang Min",'F',20}};
void main()
{ struct student *p;
for(p=stu;pnum,
p->name,p->sex,p->age);
}null用结构体变量和指向结构体的指针作为函数的参数
用结构体变量的成员作参数--值传递
用指向结构体变量或数组的指针作参数--地址传递
用结构体变量作参数--多值传递,效率低, 少用nullstruct data
{ int a, b, c; };
main()
{ void func(struct data);
struct data arg;
arg.a=27; arg.b=3; arg.c=arg.a+arg.b;
printf("arg.a=%d arg.b=%d arg.c=%d\n",arg.a,arg.b,arg.c);
printf("Call Func()....\n");
func(arg);
printf("arg.a=%d arg.b=%d arg.c=%d\n",arg.a,arg.b,arg.c);
}
void func(struct data parm)
{ printf("parm.a=%d parm.b=%d parm.c=%d\n",parm.a,parm.b,parm.c);
printf("Process...\n");
parm.a=18; parm.b=5; parm.c=parm.a*parm.b;
printf("parm.a=%d parm.b=%d parm.c=%d\n",parm.a,parm.b,parm.c);
printf("Return...\n");
}例 用结构体变量作函数参数nullstruct data
{ int a, b, c; };
main()
{ void func(struct data *parm);
struct data arg;
arg.a=27; arg.b=3; arg.c=arg.a+arg.b;
printf("arg.a=%d arg.b=%d arg.c=%d\n",arg.a,arg.b,arg.c);
printf("Call Func()....\n");
func(&arg);
printf("arg.a=%d arg.b=%d arg.c=%d\n",arg.a,arg.b,arg.c);
}
void func(struct data *parm)
{ printf("parm->a=%d parm->b=%d parm->c=%d\n",parm->a,parm->b,parm->c);
printf("Process...\n");
parm->a=18; parm->b=5; parm->c=parm->a*parm->b;
printf("parm->a=%d parm->b=%d parm->c=%d\n",parm->a,parm->b,parm->c);
printf("Return...\n");
}例 用结构体指针变量作函数参数null例11.4:输入三个学生的信息并打印出来...
struct stud_type
{ char name[20]; long num; int age; char sex;};
void main()
{void list(struct stud_type student);
struct stud_type student[3],*p; int i;
char numstr[20];clrscr();
for (i=0,p=student; i<3;p++,i++)
{printf("Enter all data of student[%d]:\n",i);
scanf("%s%ld%d%c",p->name,&p->num,&p->age,&p->sex);
}
for(i=0;i<3;i++) list(student[i]);
}
void list(student)
struct stud_type student;
{ printf("%-20s%8ld%6d%3c\n",student.name,student.num,
student.age ,student.sex);
}11.7 链表11.7 链表数据在计算机中的存储方式有以下四种基本结构:
顺序存储结构顺序表(线性表)如:数组
链接存储结构链表(线性表)
索引存储结构用于计算机操作系统中的文件管理功能
Hash存储结构为提高检索效率而采用
链表是指若干个数据项(每个数据项称为一个“结点”)按一定的原则连接起来。每个结点都包含用户数据和下一个结点的地址。一个简单链表示例:一个简单链表示例:1620head李为2004101850586刘娜2004102933818张三20041259501620 05863818数组与链表的区别:数组元素的个数是固定的,而组成链表的结点个数可增减。因而对于不是固定长度的列表,用数组来描述,将浪费许多内存空间;而链表并且不会造成存储空间浪费。
数组元素的存贮单元在数组定义时分配,链表结点的存贮单元在程序执行时动态向系统申请。
数组的数据元素连续存放;链表中数据元素一般是不连续存放的
对于链表的插入、删除等操作简单 处理链表所需函数1. malloc ( ) 函数的原型为:void *malloc ( unsigned size ) ; 在内存的动态存储区中分配一块大小为 size 字节的空间,并将此存储空间的起始地址作为函数值返回。
指针的类型为void型的,使用时需强制转换为相应的数据类型 处理链表所需函数链表结构需动态分配存储的,以下学习的
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
库函数就是用于实现动态存储分配的,它们在头文件alloc.h及中声明null 例: int *p; long *lp; stuct student *head;
p=(int *)malloc(10);
lp=(long *) malloc(10);
head=(struct student *)malloc(sizeof(struct student));2. calloc ( ) 函数的原型为:void *calloc ( unsigned n , unsigned size ) ;在内存的动态区中分配n个长度为size的连续空间, 返回此存储空间的起始地址null free ( void * ptr ) ; 将指针 ptr 指向的存储空间释放,交还给系统,使系统可以重新对其进行分配。3.释放空间函数free( ) ptr 值不能是随意的地址,而只能是程序在运行时通过动态分配到的存储空间的首地址。free只能与内存分配函数配合使用。pt = ( long * ) malloc ( 10 ) ;
……
free (pt );下面的做法是正确的:pt是指向long型的但在传递给void型的形参指针变量时,系统会自动转换练习练习一、若指针p已正确定义,要使p指向两个连续的整型动态存储单元,不正确的语句是
A) p=2*(int*)malloc(sizeof(int));
B) p=(int*)malloc(2*sizeof(int));
C) p=(int*)malloc(2*2);
D) p=(int*)calloc(2,sizeof(int)); √null二、设有如下定义,则对pp中的name成员的正确输入语句是:struct s {char *name; int no; } pp;
①scanf(“%s”, name);
②scanf(“%s”, pp.name);
③scanf(“%s”, &&pp.name);
④ { char buf[120];
scanf(“%s”, buf);
pp.name = (char *)malloc(strlen(buf)+1);
strcpy(pp.name, buf); } 给结构体变量中字符指针赋值一般采用的就是这种方式 链表操作(自学完成) 链表操作(自学完成)包括建立链表、链表的插入、链表的删除及链表的输出等操作
本部分内容,结合课程
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
要求自学11.8 共用体11.8 共用体结构体类型解决了如何描述一个逻辑上相关,但数据类型不同的一组数据项的集合。
在需要节省内存储空间时,c语言还提供了一种由若干个不同类型的数据项组成,但共享同一存储空间的构造类型。共用体是一种构造数据类型,也叫联合体或共同体
用途:使几个不同类型的变量共占一段内存(相互覆盖)11.8 共用体11.8 共用体共用体类型定义
定义形式:union 共用体名
{
类型标识符 成员名;
类型标识符 成员名;
…………….
};例 union data
{ int i;
char ch;
float f;
};类型定义不分配内存,只是说明此类型数据的组成情况null形式一:
union data
{ int i;
char ch;
float f;
}a,b;形式二:
union data
{ int i;
char ch;
float f;
};
union data a,b,c,*p,d[3];形式三:
union
{ int i;
char ch;
float f;
}a,b,c;共用体变量的定义共用体变量定义分配内存,
长度=最长成员所占字节数共用体变量任何时刻
只有一个成员存在null共用体变量引用
引用方式:共用体变量名.成员名共用体指针名->成员名(*共用体指针名).成员名null共用体变量引用
引用方式:例f1 a.i=1;
a.ch='a';
a.f=1.5;
printf("%d",a.i); (编译通过,运行结果不对) 引用规则
不能引用共用体变量,只能引用其成员
共用体变量中起作用的成员是最后一次存放的成员例 union
{ int i;
char ch;
float f;
}a;
a=1; () 例f2:
u.ch='a';
u.i=100;
putchar(u.ch); 结果输出:d
(因为d的ASCII码是100)null共用体变量引用
引用方式:引用规则
不能引用共用体变量,只能引用其成员
共用体变量中起作用的成员是最后一次存放的成员可以用一个共用体变量为另一个变量赋值例 float x;
union
{ int i; char ch; float f;
}a,b;
a.i=1; a.ch=‘a’; a.f=1.5;
b=a; ()
x=a.f; ()null例 将一个整数按字节输出运行结果:
i=6141
ch0=41,ch1=61
ch0=A,ch1=a#include
void main()
{ union int_char
{ int i;
char ch[2];
}x;
x.i=24897;
printf("i=%x\n",x.i);
printf("ch0=%x,ch1=%x\n
ch0=%c,ch1=%c\n",
x.ch[0],x.ch[1],x.ch[0],x.ch[1]);
}变量xinull结构体与共用体
区别: 存储方式不同联系: 两者可相互嵌套变量的各成员同时存在
地址各不相同
可以对变量初始化任一时刻只有一个成员起作用
成员地址一样
不能对变量初始化null例11.12 结构体中嵌套共用体 struct
{ int num;
char name[10];
char sex;
char job;
union
{ int class;
char position[10];
}category;
}person[2];结构体的成员category为共用体,根据job的值来决定category是存储学生班级,还是存储教师职称。nullfor(i=0;i<2;i++)
{scanf("%d %s %c %c", &person[i].num, person[i].name, &person[i].sex, &person[i].job);
if(person[i].job=='s')
scanf("%d",&person[i].category.class);
else if(person[i].job=='t')
scanf("%s",person[i].category.position);
else
printf("Input error!");
}
printf("\n");输入数据代码相同部分的输入不同部分的输人,用if语句实现nullprintf("No. name sex job class/position\n");
for(i=0;i<2;i++)
{printf("%-6d%-10s%-3c%-3c", person[i].num, person[i].name, person[i].sex, person[i].job);
if(person[i].job=='s')
printf("%-6d\n", person[i].category.class);
else
printf("%-6s\n", person[i].category.position);
}输出部分输出表头相同部分的输出不同部分的输出11.9 枚举类型在实际问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
中, 有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月等等。如果把这些量说明为整型, 字符型或其它类型显然是不妥当的。 为此,C语言提供了一种称为“枚举”的类型。枚举类型是一种基本数据类型,而不是一种构造类型, 因为它不能再分解为任何基本类型。11.9 枚举类型枚举类型的定义枚举类型的定义枚举类型定义的一般形式为:
enum 枚举名 { 枚举值表 };
在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。
例如:
enum weekday{ sun,mou,tue,wed,thu,fri,sat };
该枚举名为weekday,枚举值共有7个,即一周中的七天。 凡被说明为weekday类型变量的取值只能是七天中的某一天。null如同结构和共用体一样,可采用下述任一种方式:
方式一:enum weekday
{ ......
};
enum weekday a,b,c;
方式二: enum weekday
{ ......
}a,b,c;
方式三: enum
{ ......
}a,b,c;枚举类型变量的说明枚举类型变量的赋值和使用枚举类型变量的赋值和使用enum weekday{ sun,mou,tue,wed,thu,fri,sat };
枚举类型在使用中有以下规定:
枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。
例如对枚举weekday的元素再作以下赋值: sun=5; mon=2; sun=mon;
都是错误的。
枚举元素本身由系统定义了一个表示序号的数值,从0 开始顺序定义为0,1,2…。如在weekday中,sun值为0,mon值为1, …,sat值为6。null只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。
a=sum; b=mon; 是正确的。
a=0; b=1; 是错误的。
如一定要把数值赋予枚举变量,则必须用强制类型转换。
如: a=(enum weekday)2;
相当于: a=tue;
枚举元素不是字符常量也不是字符串常量, 使用时不要加单、双引号。11.10 用typedef定义类型功能:用自定义名字为已有数据类型命名
类型定义简单形式: typedef type name;例 typedef int INTEGER;类型定义语句关键字已有数据类型名用户定义的类型名例 typedef float REAL;类型定义后,与已有类型一样使用例 INTEGER a,b,c;
REAL f1,f2; 说明:
1.typedef 没有创造新数据类型
2.typedef 是定义类型,不能定义变量
3.typedef 与 define 不同 define typedef
预编译时处理 编译时处理
简单字符置换 为已有类型命名 11.10 用typedef定义类型nulltypedef定义类型步骤
按定义变量方法先写出定义体 如 int i;
将变量名换成新类型名 如 int INTEGER;
最前面加typedef 如 typedef int INTEGER;
用新类型名定义变量 如 INTEGER i,j; nullnull例 定义结构体类型
struct date
{ int month;
int day;
int year;
}d;例 定义结构体类型
struct date
{ int month;
int day;
int year;
}DATE;例 定义结构体类型
typedef struct date
{ int month;
int day;
int year;
}DATE;例 定义结构体类型
DATE birthday, *p; struct date
{ int month;
int day;
int year;
}birthday, *p;null例 typedef struct club
{ char name[20];
int size;
int year;
}GROUP;
typedef GROUP *PG;
PG pclub; GROUP *pclub;
struct club *pclub;GROUP为结构体类型
PG为指向GROUP的指针类型typedef定义可嵌套