结构体和共用体ppt课件

上传人:m**** 文档编号:568525076 上传时间:2024-07-25 格式:PPT 页数:62 大小:492KB
返回 下载 相关 举报
结构体和共用体ppt课件_第1页
第1页 / 共62页
结构体和共用体ppt课件_第2页
第2页 / 共62页
结构体和共用体ppt课件_第3页
第3页 / 共62页
结构体和共用体ppt课件_第4页
第4页 / 共62页
结构体和共用体ppt课件_第5页
第5页 / 共62页
点击查看更多>>
资源描述

《结构体和共用体ppt课件》由会员分享,可在线阅读,更多相关《结构体和共用体ppt课件(62页珍藏版)》请在金锄头文库上搜索。

1、第九章 构造体和共用体 本章引见了C言语中的最后几种数据类型:构造体、共用体、位段以及如何运用typedef定义类型。其中构造体类型是重点,要求掌握定义、援用、初始化及运用等。构造体与指针的结合既是本章的重点又是难点。最后,引见了内存的动态分配和单向链表的简单操作。l 构造体l 构造体型指针l 共用体l 用typedef定义类型l 构造体型数组l 内存的动态分配l 位段l 程序例如构造体类型的定义 C言语提供的 构造体 类型,能将具有内在联络的不同类型的数据组合在一同,以便于处置。构造体类型的定义方式: struct 构造体类型 成员表列; ;例如:例如: struct student lon

2、g int num; char name20; char sex; int age; ; 10001Li FangM18numnamesexage阐明: (1) 关键字struct和构造体类型名组成一种类型标识符,类型名的起名规那么服从标识符。 (2)成员表列列出了本构造体类型所包含的假设干个成员。构造体类型变量的定义要定义一个构造体类型的变量,可以采用以下三种方法:(1) 先定义类型在定义变量名。 例如(2) 在定义类型的同时定义变量。例如(3)直接定义构造体类型变量。 例如阐明: (1) 第一种定义方式最好,概念清楚,易于扩展移植。 (2) 构造体型变量所占内存空间是各成员变量所占内存单元

3、的总和,普通占一片延续单元。 (3)成员也可以是一个构造体变量 例如 (4)同一构造体类型中的各成员不可重名,但不同构造体类型间的各成员可以重名。要定义一个构造体类型的变量,可以采用以下三种方法:(1) 先定义类型在定义变量名。 例如(2) 在定义类型的同时定义变量。例如(3)直接定义构造体类型变量。 例如阐明: (1) 第一种定义方式最好,概念清楚,易于扩展移植。 (2) 构造体型变量所占内存空间是各成员变量所占内存单元的总和,普通占一片延续单元。 (3)成员也可以是一个构造体变量 例如 (4)同一构造体类型中的各成员不可重名,但不同构造体类型间的各成员可以重名。构造体类型变量的定义stru

4、ct student long int num; char name20; char sex; int age; ;struct student stu1, stu2;要定义一个构造体类型的变量,可以采用以下三种方法:(1) 先定义类型在定义变量名。 例如(2) 在定义类型的同时定义变量。例如(3)直接定义构造体类型变量。 例如阐明: (1) 第一种定义方式最好,概念清楚,易于扩展移植。 (2) 构造体型变量所占内存空间是各成员变量所占内存单元的总和,普通占一片延续单元。 (3)成员也可以是一个构造体变量 例如 (4)同一构造体类型中的各成员不可重名,但不同构造体类型间的各成员可以重名。构造体

5、类型变量的定义struct student long int num; char name20; char sex; int age; stu1, stu2;要定义一个构造体类型的变量,可以采用以下三种方法:(1) 先定义类型在定义变量名。 例如(2) 在定义类型的同时定义变量。例如(3)直接定义构造体类型变量。 例如阐明: (1) 第一种定义方式最好,概念清楚,易于扩展移植。 (2) 构造体型变量所占内存空间是各成员变量所占内存单元的总和,普通占一片延续单元。 (3)成员也可以是一个构造体变量 例如 (4)同一构造体类型中的各成员不可重名,但不同构造体类型间的各成员可以重名。构造体类型变量的

6、定义struct long int num; char name20; char sex; int age; stu1, stu2;构造体类型变量的定义要定义一个构造体类型的变量,可以采用以下三种方法:(1) 先定义类型在定义变量名。 例如(2) 在定义类型的同时定义变量。例如(3)直接定义构造体类型变量。 例如阐明: (1) 第一种定义方式最好,概念清楚,易于扩展移植。 (2) 构造体型变量所占内存空间是各成员变量所占内存单元的总和,普通占一片延续单元。 (3)成员也可以是一个构造体变量 例如 (4)同一构造体类型中的各成员不可重名,但不同构造体类型间的各成员可以重名。struct date

7、 int month; int day; int year; ; struct student long int num; char name20; char sex; int age; struct date birthday; stu1, stu2;构造体型变量及其成员的援用 构造体型变量可援用的对象:变量名代表变量的整体,成员名 代表变量的各个成员。援用时留意:(1) 变量成员的援用方法:构造体变量名 . 成员名 如 stu1.num, stu1.name stu1.birthday.month(2) 构造体型变量可以整体援用来赋值,如stu1=stu2。但不可以进展整体的输入 输出,如

8、 printf( “%s, stu1); 是错误的(3) 构造体型变量的首地址称为该构造体型变量的地址,其每个成员的首地址称 为该成员的地址,两个地址均可援用。如: scanf( “%d, &stu1.age); /*输入成员的值*/ printf( “0x%x, &stu1); /*输出构造体变量的首地址*/构造体型变量的初始化 构造体型变量的初始化,即直接以初值表的方式赋值。如:stu1,stu2的初始化: struct student stu1=99001,Wang lin.M,21; struct student stu2=99002,Liu Dong,F,19; 一切构造体型变量均可

9、如此初始化。 例1:利用构造体类型,编程计算一名同窗5门课的平均分。 例2:将上例改为输入恣意多人5门课的成果,求平均分。例 1:利用构造体类型,编程计算一名同窗5门课的平均分void main( ) struct stuscore char name20; float score5; float average; ; struct stuscore x=Wang wei,90.5,85,70,90,98.5; int i; float sum=0; for(i=0;i5;i+)sum+=x.scorei; x.average=sum/5; printf( “The average score

10、 of %s is %4.1fn, x.name, x.average);运转结果:定义构造体类型void main( ) struct stuscore char name20; float score5; float average; ; struct stuscore x=Wang wei,90.5,85,70,90,98.5; int i; float sum=0; for(i=0;i5;i+)sum+=x.scorei; x.average=sum/5; printf( “The average score of %s is %4.1fn, x.name, x.average);运转

11、结果:Wang Wei90.585709098.5&x定义构造体类型变量,并初始化例 1:利用构造体类型,编程计算一名同窗5门课的平均分void main( ) struct stuscore char name20; float score5; float average; ; struct stuscore x=Wang wei,90.5,85,70,90,98.5; int i; float sum=0; for(i=0;i5;i+)sum+=x.scorei; x.average=sum/5; printf( “The average score of %s is %4.1fn, x.

12、name, x.average);运转结果:Wang Wei90.585709098.5&x计算5门课的总分例 1:利用构造体类型,编程计算一名同窗5门课的平均分void main( ) struct stuscore char name20; float score5; float average; ; struct stuscore x=Wang wei,90.5,85,70,90,98.5; int i; float sum=0; for(i=0;i5;i+)sum+=x.scorei; x.average=sum/5; printf( “The average score of %s

13、is %4.1fn, x.name, x.average);运转结果:Wang Wei90.585709098.586.8&x计算5门课的平均分例 1:利用构造体类型,编程计算一名同窗5门课的平均分void main( ) struct stuscore char name20; float score5; float average; ; struct stuscore x=Wang wei,90.5,85,70,90,98.5; int i; float sum=0; for(i=0;i5;i+)sum+=x.scorei; x.average=sum/5; printf( “The av

14、erage score of %s is %4.1fn, x.name, x.average);运转结果:The average score of Wang wei is 86.8Wang Wei90.585709098.586.8&x输出结果例 1:利用构造体类型,编程计算一名同窗5门课的平均分#include void main( ) struct stuscore char name20; float score5; float average; x; int i; float sum; char rep; while(1) printf( “n Do you want to conti

15、nue? (Y/N); rep=getche( ); if(rep = = n | rep = = N) break; sum=0; printf( “n Input name(as XU_jun) and 5 scores(depart by ):n); scanf( “%s, x.name); for(i=0; i5; i+) scanf( “%f, &x.scorei); for(i=0; i5; i+) sum+=x.scorei; x.average=sum/5; printf( “The average score of %s is %4.1fn, x.name, x.averag

16、e); 例 2:将上例改为输入恣意多人5门课的成果,求平均分。运转结果:#include void main( ) struct stuscore char name20; float score5; float average; x; int i; float sum; char rep; while(1) printf( “n Do you want to continue? (Y/N); rep=getche( ); if(rep = = n | rep = = N) break; sum=0; printf( “n Input name(as XU_jun) and 5 scores(

17、depart by ):n); scanf( “%s, x.name); for(i=0; i5; i+) scanf( “%f, &x.scorei); for(i=0; i5; i+) sum+=x.scorei; x.average=sum/5; printf( “The average score of %d is %4.1fn, x.name, x.average); 例 2:将上例改为输入恣意多人5门课的成果,求平均分。运转结果:Do you want to continue?(Y/N)#include void main( ) struct stuscore char name2

18、0; float score5; float average; x; int i; float sum; char rep; while(1) printf( “n Do you want to continue? (Y/N); rep=getche( ); if(rep = = n | rep = = N) break; sum=0; printf( “n Input name(as XU_jun) and 5 scores(depart by ):n); scanf( “%s, x.name); for(i=0; i5; i+) scanf( “%f, &x.scorei); for(i=

19、0; i5; i+) sum+=x.scorei; x.average=sum/5; printf( “The average score of %d is %4.1fn, x.name, x.average); 例 2:将上例改为输入恣意多人5门课的成果,求平均分。运转结果:Do you want to continue?(Y/N) Y#include void main( ) struct stuscore char name20; float score5; float average; x; int i; float sum; char rep; while(1) printf( “n

20、 Do you want to continue? (Y/N); rep=getche( ); if(rep = = n | rep = = N) break; sum=0; printf( “n Input name(as XU_jun) and 5 scores(depart by ):n); scanf( “%s, x.name); for(i=0; i5; i+) scanf( “%f, &x.scorei); for(i=0; i5; i+) sum+=x.scorei; x.average=sum/5; printf( “The average score of %d is %4.

21、1fn, x.name, x.average); 例 2:将上例改为输入恣意多人5门课的成果,求平均分。运转结果:Do you want to continue?(Y/N) YInput name(as Xu_jun) and 5 scores(depart by):#include void main( ) struct stuscore char name20; float score5; float average; x; int i; float sum; char rep; while(1) printf( “n Do you want to continue? (Y/N); rep

22、=getche( ); if(rep = = n | rep = = N) break; sum=0; printf( “n Input name(as XU_jun) and 5 scores(depart by ):n); scanf( “%s, x.name); for(i=0; i5; i+) scanf( “%f, &x.scorei); for(i=0; i5; i+) sum+=x.scorei; x.average=sum/5; printf( “The average score of %d is %4.1fn, x.name, x.average); 例 2:将上例改为输入

23、恣意多人5门课的成果,求平均分。运转结果:Do you want to continue?(Y/N) YInput name(as Xu_jun) and 5 scores(depart by):Guo_Yong 80 89.5 99 87.5#include void main( ) struct stuscore char name20; float score5; float average; x; int i; float sum; char rep; while(1) printf( “n Do you want to continue? (Y/N); rep=getche( );

24、if(rep = = n | rep = = N) break; sum=0; printf( “n Input name(as XU_jun) and 5 scores(depart by ):n); scanf( “%s, x.name); for(i=0; i5; i+) scanf( “%f, &x.scorei); for(i=0; i5; i+) sum+=x.scorei; x.average=sum/5; printf( “The average score of %d is %4.1fn, x.name, x.average); 例 2:将上例改为输入恣意多人5门课的成果,求

25、平均分。运转结果:Do you want to continue?(Y/N) YInput name(as Xu_jun) and 5 scores(depart by):Guo_Yong 80 89.5 99 87.5Do you want to continue?(Y/N)#include void main( ) struct stuscore char name20; float score5; float average; x; int i; float sum; char rep; while(1) printf( “n Do you want to continue? (Y/N)

26、; rep=getche( ); if(rep = = n | rep = = N) break; sum=0; printf( “n Input name(as XU_jun) and 5 scores(depart by ):n); scanf( “%s, x.name); for(i=0; i5; i+) scanf( “%f, &x.scorei); for(i=0; i5; i+) sum+=x.scorei; x.average=sum/5; printf( “The average score of %d is %4.1fn, x.name, x.average); 例 2:将上

27、例改为输入恣意多人5门课的成果,求平均分。运转结果:Do you want to continue?(Y/N) YInput name(as Xu_jun) and 5 scores(depart by):Guo_Yong 80 89.5 99 87.5Do you want to continue?(Y/N) N构造体型数组 数组中的元素为构造体型数据,在构造树、表、队列等数据构造时尤其方便。构造体型数组的定义:和构造体变量的方法相仿,只需阐明其为数组即可。如 struct student stu5;构造体型数组的初始化: 初始化方式是定义数组时,后面加上=初值列表,如: struct st

28、udent stu2=99001, “Wang Jian, F, 20, 99002, “Liu Li, M, 19 ;例如:用构造体型数组初始化建立一工资登记表,然后键入其中一人的 姓名,查询其工资情况。构造体数组例如例 3:用构造体数组初始化建立一工资登记表,键入其中一人姓名,查询其工资情况。int i; char xname20;printf(nInput the workers name: );Scanf(%s, xname);for(i=0;i3;i+) if(strcmp(xname,workeri.name)=0) printf(*%s*,xname); printf(nsala

29、ry:%6d,workeri.salary); printf(ncost:%6d,workeri.cost); printf(npayed:%6dn,workeri.salary- workeri.cost); #includevoid main( ) struct staff char name20; char departmet20; int salary; int cost; worker3= Xu_Guo, part1, 800, 200, Wu_Xia, part2, 1000, 300, Li_Jun, part3, 1200, 350 ;构造体数组例如例 3:用构造体数组初始化建

30、立一工资登记表,键入其中一人姓名,查询其工资情况。运转结果:Input the workers name: Wu_Xiaint i; char xname20;printf(nInput the workers name: );Scanf(%s, xname);for(i=0;i3;i+) if(strcmp(xname,workeri.name)=0) printf(*%s*,xname); printf(nsalary:%6d,workeri.salary); printf(ncost:%6d,workeri.cost); printf(npayed:%6dn,workeri.salary

31、- workeri.cost); #includevoid main( ) struct staff char name20; char departmet20; int salary; int cost; worker3= Xu_Guo, part1, 800, 200, Wu_Xia, part2, 1000, 300, Li_Jun, part3, 1200, 350 ;构造体数组例如运转结果:Input the workers name: Wu_Xia*Wu_Xia*salary: 1000cost: 300payed: 700例 3:用构造体数组初始化建立一工资登记表,键入其中一人姓

32、名,查询其工资情况。#includevoid main( ) struct staff char name20; char departmet20; int salary; int cost; worker3= Xu_Guo, part1, 800, 200, Wu_Xia, part2, 1000, 300, Li_Jun, part3, 1200, 350 ;int i; char xname20;printf(nInput the workers name: );Scanf(%s, xname);for(i=0;i成员名l 留意:以下表达式的含义-的优先级高于+l p-n 得到成员n的值

33、l p-n+ 得到成员n的值,用完该值后使它加1l +p-n 得到成员n的值使之加1(先加)long int numchar name20char sexint agep例 4:构造体成员的三种援用方式void main( ) struct staff char name20; char department20; int salary; ; struct staff w1,*p; p=&w1; strcpy(w1.name, Li_Li); /* 某人的信息*/ strcpy(*p).department, part1); p-salary=1000; printf( %s %s %dn ,

34、 w1.name, w1.department, w1.salary); printf( %s %s %dn , (*p).name, (*p).department, (*p).salary); printf( %s %s %dn , p-name, p-department, p-salary);运转结果:Li_Li part1 1000Li_Li part1 1000Li_Li part1 1000void main( ) struct staff char name20; char department20; int salary; ; struct staff w1,*p; p=&w

35、1; strcpy(w1.name, Li_Li); /* 某人的信息*/ strcpy(*p).department, part1); p-salary=1000; printf( %s %s %dn , w1.name, w1.department, w1.salary); printf( %s %s %dn , (*p).name, (*p).department, (*p).salary); printf( %s %s %dn , p-name, p-department, p-salary);例 4:构造体成员的三种援用方式指向构造体型数组的指针 构造体数组可用指针来访问,方便数组元

36、素的援用,提高数组的访问效率。 例如: 用指向构造体型数组的指针实现显示工资表的程序 留意: (1) 假设p的初值为worker,即指向第一个元素,那么p+1后指向下一个元素的起始地址。 例如: (+p)-name 先使p自加1,然后得到它指向的元素中的name成员值。 (p+)-name 先得到p-name的值,然后使p自加1,指向worker1. (2) 指针p已定义指向struct staff类型的数据,它只能指向一个构造体型数组,而不能指向元素中的某一成员。Wang_Li600Li_Ping700Liu_Yuan800pp+1worker&worker0&worker1&worker2

37、例 5:利用构造体型指针显式工资表struct staff char name20; int salary;void main( ) struct staff *p; struct staff worker3=Wang_Li, 600, Li_Ping, 700, Liu_Yuan, 800; for(p=worker;pname, p-salary);运转结果:Wang_Lis salary is 600 yuanLi_Pings salary is 700 yuanLiu_Yuans salary is 800 yuanWang_Li600Li_Ping700Liu_Yuan800pp+1

38、worker&worker0&worker1&worker2例 5:利用构造体型指针显式工资表struct staff char name20; int salary;void main( ) struct staff *p; struct staff worker3=Wang_Li, 600, Li_Ping, 700, Liu_Yuan, 800; for(p=worker;pname, p-salary);用指向构造体型的指针作函数参数假想象将一个构造体变量的值传送给另一个函数,可以: (1) 用构造体变量作为函数实参,将构造体变量所占内存单元的内容全部顺序传送给形参。 (2) 用指向构

39、造体变量或数组的指针作实参。将构造体变量或数组的地址传送给形参。那么形参、实参共用一段存储空间。例 6:用子函数求出worker数组中每个工人的实发工资例 7:有四个学生,每个学生包括学号、姓名、成果。要求找出成果最高者 的姓名和成果。例 6:用子函数求每个工人的实发工资#include#define NUM 2struct staff char name20; char department20; int salary; int cost; int realsum; ;void getreal(struct staff *p, int n) int i; for(i=0;irealsum=p

40、-salary=p-cost;void main( ) struct staff workerNUM, *pm; int i; printf(Input %d workers name department salary cost: n, NUM); for(i=0, pm=worker; iname, pm-department, pm-salary, pm-cost); pm=worker; getreal(pm, NUM); for(pm=worker; pmname, pm-department, pm-realsum);运转结果:Input 2 workers name deparm

41、ent salary cost:#include#define NUM 2struct staff char name20; char department20; int salary; int cost; int realsum; ;void getreal(struct staff *p, int n) int i; for(i=0;irealsum=p-salary=p-cost;void main( ) struct staff workerNUM, *pm; int i; printf(Input %d workers name department salary cost: n,

42、NUM); for(i=0, pm=worker; iname, pm-department, pm-salary, pm-cost); pm=worker; getreal(pm, NUM); for(pm=worker; pmname, pm-department, pm-realsum);例 6:用子函数求每个工人的实发工资运转结果:Input 2 workers name deparment salary cost:Wang part1 1000 200Liu part2 1500 300#include#define NUM 2struct staff char name20; ch

43、ar department20; int salary; int cost; int realsum; ;void getreal(struct staff *p, int n) int i; for(i=0;irealsum=p-salary=p-cost;void main( ) struct staff workerNUM, *pm; int i; printf(Input %d workers name department salary cost: n, NUM); for(i=0, pm=worker; iname, pm-department, pm-salary, pm-cos

44、t); pm=worker; getreal(pm, NUM); for(pm=worker; pmname, pm-department, pm-realsum);例 6:用子函数求每个工人的实发工资运转结果:Input 2 workers name deparment salary cost:Wang part1 1000 200Liu part2 1500 300Wang of part1 should be payed 800 yuan Liu of part2 should be payed 1200 yuan#include#define NUM 2struct staff cha

45、r name20; char department20; int salary; int cost; int realsum; ;void getreal(struct staff *p, int n) int i; for(i=0;irealsum=p-salary=p-cost;void main( ) struct staff workerNUM, *pm; int i; printf(Input %d workers name department salary cost: n, NUM); for(i=0, pm=worker; iname, pm-department, pm-sa

46、lary, pm-cost); pm=worker; getreal(pm, NUM); for(pm=worker; pmname, pm-department, pm-realsum);例 6:用子函数求每个工人的实发工资void main( ) struct student int num; char name20; float score; ; struct student stu4,*p; int i,temp=0; float max; for(i=0;i4;i+) scanf(%d %s %f , &stui.num, stui.name, &stui.score); for(m

47、ax=stu0.score,i=1;imax) max=stui.score;temp=i; p=stu+temp; printf(nThe maximum score:n); printf(No.:%dnname:%snscore:%4.1fn, p-num, p-name, p-score);101Li90102Tan98103Wang67104Fun89stup, stu+1例 7:找出四个学生中成果最高者的姓名和成果101Li90102Tan98103Wang67104Fun89stup, stu+1运转结果:101 Li 90例 7:找出四个学生中成果最高者的姓名和成果void ma

48、in( ) struct student int num; char name20; float score; ; struct student stu4,*p; int i,temp=0; float max; for(i=0;i4;i+) scanf(%d %s %f , &stui.num, stui.name, &stui.score); for(max=stu0.score,i=1;imax) max=stui.score;temp=i; p=stu+temp; printf(nThe maximum score:n); printf(No.:%dnname:%snscore:%4.

49、1fn, p-num, p-name, p-score);101Li90102Tan98103Wang67104Fun89stup, stu+1运转结果:101 Li 90102 Tan 98例 7:找出四个学生中成果最高者的姓名和成果void main( ) struct student int num; char name20; float score; ; struct student stu4,*p; int i,temp=0; float max; for(i=0;i4;i+) scanf(%d %s %f , &stui.num, stui.name, &stui.score);

50、for(max=stu0.score,i=1;imax) max=stui.score;temp=i; p=stu+temp; printf(nThe maximum score:n); printf(No.:%dnname:%snscore:%4.1fn, p-num, p-name, p-score);101Li90102Tan98103Wang67104Fun89stup, stu+1运转结果:101 Li 90102 Tan 98103 Wang 67例 7:找出四个学生中成果最高者的姓名和成果void main( ) struct student int num; char name

51、20; float score; ; struct student stu4,*p; int i,temp=0; float max; for(i=0;i4;i+) scanf(%d %s %f , &stui.num, stui.name, &stui.score); for(max=stu0.score,i=1;imax) max=stui.score;temp=i; p=stu+temp; printf(nThe maximum score:n); printf(No.:%dnname:%snscore:%4.1fn, p-num, p-name, p-score);101Li90102

52、Tan98103Wang67104Fun89stup, stu+1运转结果:101 Li 90102 Tan 98103 Wang 67104 Fun 89例 7:找出四个学生中成果最高者的姓名和成果void main( ) struct student int num; char name20; float score; ; struct student stu4,*p; int i,temp=0; float max; for(i=0;i4;i+) scanf(%d %s %f , &stui.num, stui.name, &stui.score); for(max=stu0.score

53、,i=1;imax) max=stui.score;temp=i; p=stu+temp; printf(nThe maximum score:n); printf(No.:%dnname:%snscore:%4.1fn, p-num, p-name, p-score);101Li90102Tan98103Wang67104Fun89stup, stu+1运转结果:101 Li 90102 Tan 98103 Wang 67104 Fun 89The maximumscore:No.:102name:Tanscore:98.0例 7:找出四个学生中成果最高者的姓名和成果void main( )

54、 struct student int num; char name20; float score; ; struct student stu4,*p; int i,temp=0; float max; for(i=0;i4;i+) scanf(%d %s %f , &stui.num, stui.name, &stui.score); for(max=stu0.score,i=1;imax) max=stui.score;temp=i; p=stu+temp; printf(nThe maximum score:n); printf(No.:%dnname:%snscore:%4.1fn,

55、p-num, p-name, p-score);内存的动态分配 在实践运用中,如要处置某班学生如100人的数据,可用数组来存放。 数组的特点是: 数组是一种静态分配,数组长度必需预先定义,假设学生人数变化较大,那么要按最大空间来分配,内存不能得到充分利用;数组的容量难以扩展,程序的通用性差。 为此,可采用动态分配,即在程序开场执行后才开辟和释放某些内存区。开辟和释放内存区的函数1.malloc( )函数 函数原型:void *malloc(unsigned size( ); 功能:在内存的动态存储区中分配长度为size个字节的延续空间。 其前往值=2.free(p) 功能:释放由p指向的内存区

56、。3.calloc() 函数原型: void *calloc(unsigned n,unsigned size); 功能: 分配n个长度为size个字节的延续空间,用于动态数组的分配。4.realloc 函数原型:void *realloc(void *p,unsigned size); 功能:将p所指出的已分配的内存空间重新分配成为大小为size字节的空间。 例 8:分配一个能放置双精度数的空间。 例 9:改良上例,在运用后释放动态分配的空间。分配空间的起始地址分配胜利空指针 NULL 分配失败,普通是没有空间例 8:分配一个能放置双精度的数的空间#includevoid main() do

57、uble *p; p=(double *)malloc(sizeof(double); /*注1*/ if(p=0) printf(malloc errorn); exit(0); *p=78.786; printf(*p=%fn,*p);运转结果:对注1行有两点阐明: (1) malloc函数前往值应为void *型,如今对双精度型分配空间,所以要将其前往值强行转换为 double * 型。(2) 程序中处于易于移植的思索,运用了sizeof(double)作为malloc函数的实参。运转结果:*p=78.786000#includevoid main() double *p; p=(dou

58、ble *)malloc(sizeof(double); /*注1*/ if(p=0) printf(malloc errorn); exit(0); *p=78.786; printf(*p=%fn,*p);对注1行有两点阐明: (1) malloc函数前往值应为void *型,如今对双精度型分配空间,所以要将其前往值强行转换为 double * 型。(2) 程序中处于易于移植的思索,运用了sizeof(double)作为malloc函数的实参。例 8:分配一个能放置双精度的数的空间例 9:分配一个能放置双精度数的空间,并在运用 后释放该空间。#includevoid main( ) dou

59、ble *p,*q; p=(double *)malloc(sizeof(double); if(p=0) printf(malloc errorn); exit(0); printf(p=0x%x *p=%4.1fn,p,*p=100); free(p); q=(double*)malloc(sizeof(double); if(q = = 0) printf(malloc errorn); eixt(0); *q=10.0; printf(*q=0x%x *q=%4.1f p=0x%x *p=%4.1fn, q, *q, p, *p);阐明: 改程序运转后,指针p,q均为一样的地址,阐明曾

60、经释放的由指针p所指的空间又重新分配给了指针q。由于指针p的内容没有改动,故而指针p,q都指向同一空间。从第二行的结果可验证之。运转结果:运转结果:p=0x4E7 *p=100.0q=0x4E7 *q=10.0 p=0x4e7 *p=10.0#includevoid main( ) double *p,*q; p=(double *)malloc(sizeof(double); if(p=0) printf(malloc errorn); exit(0); printf(p=0x%x *p=%4.1fn,p,*p=100); free(p); q=(double*)malloc(sizeof(

61、double); if(q = = 0) printf(malloc errorn); eixt(0); *q=10.0; printf(*q=0x%x *q=%4.1f p=0x%x *p=%4.1fn, q, *q, p, *p);阐明: 改程序运转后,指针p,q均为一样的地址,阐明曾经释放的由指针p所指的空间又重新分配给了指针q。由于指针p的内容没有改动,故而指针p,q都指向同一空间。从第二行的结果可验证之。例 9:分配一个能放置双精度数的空间,并在运用 后释放该空间。链表概述了解 链表是一种常见的数据构造,它将分散在内存中的相关信息经过指针链接在一同,构成链表。利用它可动态地分配内存空

62、间。head: 头指针,存放链表中第一个元素的首地址。结点:链表中的元素,包括:数据信息,下一结点的地址。NULL:表尾标志,表示“空地址。构造描画: struct node char c; struct node *next; ;1111A1230B3800C2020NNULL.单链表表示图建立链表: 从无到有建立起一个链表,即一个一个地输入各结点数据,并建立 起前后相链的关系。详细步骤:(1) 先建一空链表,并使指针p2指向链表表尾:head=NULL;(2) 开辟第一个结点空间并由p1指向,即: p1=(struct node*)malloc(sizeof(struct node); 输

63、入数据信息,并将该信息挂在链头上: head=p1;(3) 挪动p2,使其扔指向最后一个结点: p2=p1;(4) 再开辟下一结点空间,并由p1指向,输入数据后,挂至链尾,即执行: p1=(struct node*)malloc(sizeof(struct node); p2-next=p1;(5) 反复(3)、(4)两步,直至输入一切数据,令p2-next=NULL;建链终了。建立链表的操作了解1. 链表的遍历输出 演示 2. 链表的查找 演示3. 链表的删除 演示4. 链表的插入 演示链表的其它操作了解共用体了解l 定义方式: union 共用体名 l 成员表列;l 变量列表;l 例如:

64、union data l int i;l char ch;l float f;l data;l 作用: 将几种不同类型的变量存放到同一段内存单元中。l 共用体变量的援用方式:l 必需先定义后援用,且不能援用共用体变量,只能援用共用体变量中的成员。例如:l 正确: scanf(“%d,&data.i);l printf(“%f, data.f)l 不正确: printf(“%d, data);l data=1;共用体续l 共用体变量的特点:l (1)同一个内存段可以用来存放几种不同类型的成员,但在每一瞬间时只需一个成员起作用。l (2)共用体变量中起作用的成员是最后一次存放的成员。l (3)共用

65、体变量的地址和它的各成员的地址都是同一地址,如以下图所示。l (4)不能对共用体变量名赋值,也不能在定义时对它初始化。l (5)不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以运用指向共用体变量的指针。l (6)共用体类型可以出如今构造体类型定义中,也可以定义共用体数组。chif&data共用体变量在内存中的存储情况 位段是一种特殊的构造体类型,其每个成员是以位为单位来定义长度的,不再是各种类型的变量。例如:阐明: (1) 一个位段必需被阐明成 int,unsigned或signed中的任一种。长度为1的位段被以为是unsigned类型。 (2) 位段中成员的援用与构造体中成员

66、的援用一样,用.运算符。 (3) 可定义无名位段。 (4) 一个位段必需存贮在同一存贮单元中。 (5) 位段可在表达式中被援用(按整型数),也可用整型格式符输出。 (6) 位段变量不能定义成数组。 (7) 不同机器内,位段从右到左,还是从左到右分配是不定的。位段struct packed_data unsigned x:1; unsigned y:2; unsigned z:3; bits;bitsZyx156310#includevoid main( ) union int i; struct unsigned a:1; unsigned b:2; unsigned c:3; bits; n

67、um; printf(Input an integer between 0 to 15:n); scanf(%d, &num); printf(i=%3d,bits=%3d%3d%3dn, num.i, num.bits.c, num.bits.b, num.bits.a);分别以输入4、7、15为例运转:请选择输入 4 15 7运转结果:例 10:请选择输入 4 15 7#includevoid main( ) union int i; struct unsigned a:1; unsigned b:2; unsigned c:3; bits; num; printf(Input an in

68、teger between 0 to 15:n); scanf(%d, &num); printf(i=%3d,bits=%3d%3d%3dn, num.i, num.bits.c, num.bits.b, num.bits.a);分别以输入4、7、15为例运转:运转结果:Input an integer between 0 to 15:4例 10:请选择输入 4 15 7运转结果:Input an integer between 0 to 15:4i= 4 bits= 1 0 0#includevoid main( ) union int i; struct unsigned a:1; un

69、signed b:2; unsigned c:3; bits; num; printf(Input an integer between 0 to 15:n); scanf(%d, &num); printf(i=%3d,bits=%3d%3d%3dn, num.i, num.bits.c, num.bits.b, num.bits.a);分别以输入4、7、15为例运转:例 10:用typedef定义类型typedef语句的普通方式为: typedef 原数据类型 新的数据类型名;例如: (1) typedef int INTEGER; /*用INTEGER替代int类型*/ INCEGER

70、a, b; (2) typedef struct int year; int month; int day; DATE; /*用DATE替代构造体类型*/ DATE birthday;阐明: (1) 用typedef可以定义各种类型名,但不能用来定义变量。 (2) 用typedef只是对已存在的类型添加一个类型名,没有发明新的类型。 (3) 习惯上常把用typedef定义的类型名用大写字母表示,以区别于系统提供的规范类型。 (4) 当不同源文件要公用同一些数据类型,常用typedef定义这些数据类型,并放在一个文件中,在需求时用#include命令把它们包含进来。 (5) 运用typedef有

71、利于程序的通用和移植。程序例如本节经过两个典型例如分析,加深对构造体的了解。例 11 经过本例深化了解构造体型指针的援用。例 12 经过本例可深化了解作为节点的构造体型变量的援用。struct xint a;char *b; *p;char x0 =Li, x1 =Zhang;struct x xv =1,x0, 4,x1;void main( ) p=xv; printf(%c,+*p-b); printf(%d,(*p).a); printf(%d,+p-a); printf(%d,(+p)-a); printf(%c,*(p+)-b);程序分析:1、-优先于*,+在前先自加、后操作,+在

72、后先操作、后自加。2、第一行printf先是p-b取出x0的地址,再加*取出数组x0的第一个元素,然后加1变M输出。3、倒数第二行的括号使指针p先加1,指向数组xv的第二个元素,再取其成员变量a,及输出4。4、最后一行的括号无法改动+在后、后自加的属性,故输出的是*(p-b),即Z,之后指针p加1。运转结果:M 1 2 4 Z例 11:构造体型指针例如struct stint n;struct st *next; ;struct st a3=1, &a0, 2, a+1, 3, &a2;void main( ) struct st *p=a; printf(“%dt, p+-n); printf(“%dt, +p-n); printf(“%dt, (+p)-n); printf(“%dn, *(p+)-next);程序分析:1、第一行+在后,先取出p所指的成员变量n,即输出1,然后p加1,指向数组a的第二元素。2、第二行+在前,先使p所指的数组a的第二元素的成员变量n的值加1,即2+1=3,然后输出该值。3、第三行先使p加1,指向数组a的第三元素,然后取出其成员变量n,即输出3.4、第四行的括号无法改动,+在后,后自加的属性,故输出的是*(p-next),即3,之后指针P加1。运转结果:1 3 3 3例 12:作为结点的构造体型变量的援用例如

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号