资源预览内容
第1页 / 共54页
第2页 / 共54页
第3页 / 共54页
第4页 / 共54页
第5页 / 共54页
第6页 / 共54页
第7页 / 共54页
第8页 / 共54页
第9页 / 共54页
第10页 / 共54页
亲,该文档总共54页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
11.1 概述 为了将不同类型的数据组合成一个有机的整体,以便引用, C 语言提供了一种数据结构,叫结构体 (structure)。 定义结构体类型的一般形式: struct 结构体名 成员表列 ; 其中:struct为关键字,表示是一个“结构体类型”; 结构体名: 命名规则同用户标识符,代表具体定义的一种结构体类型; 成员表列: 组成结构体的各成员项。,第十一章 结构体与共用体,比如定义如下一个结构体类型: struct student int num ; char name20 ; char sex ; int age ; float score ; char addr30 ; ; 我们假设由它所定义的变量已经有值,则存放格式如下:,num,name,sex,age,score,addr,10010,Li Fun,M,18,87.5,Beijing,11.2 定义结构体类型变量的方法 一. 先定义结构体类型再定义变量名 如上页所定义的结构体类型struct student,它只是一种用户所定义的数据类型,和基本数据类型使用方法相同,在没有用它来定义具体的变量前,系统不会为它分配内存空间,当然也就无法用它来保存具体的结构体数据。为此,我们要用一个已定义的结构体类型来定义与之相应的结构体变量。方法是: struct student student1, student2; 以上表示:student1, student2为struct student类型的变量。 由此可见,定义一个结构体类型变量,不仅要求指定变量为结构体类型(struct),而且要求指定为某一特定的结构体类型(student)。,二. 在定义结构体类型的同时定义其变量,struct 结构体名 成员表列 变量名表列;,如: struct student int num ; char name20 ; char sex ; int age ; float score ; char addr30 ; student1, student2;,三. 直接定义结构体类型变量 struct 成员表列 变量名表列; 在这种定义方式中,不出现结构体名。,如:struct int num ; char name20 ; char sex ; int age ; float score ; char addr30 ; student 1, student2;,思考一下: 既然花括弧有“界定”的作用,那在结构体类型的定义中,反向花括弧的后面为什么还要打分号? 回答: 因为在反向花括弧和分号之间还可能有变量的定义,所以必须要用分号来指明定义到此结束,后面不会再有变量的定义了。,3. 结构体的成员可以又是一个结构体变量. 如: struct date int month ; int day ; int year ; ; struct student int num ; char name20 ; char sex ; int age ; struct date birthday; char addr30 ; student1,student2 ;,birthday,month,day,year,几点说明: 1. 只能对结构体类型变量赋值,存取,运算等,而不能对结构体类型赋值,存取,运算等。 2. 结构体中的成员如同普通变量一样,可以单独使用。,4. 结构体类型中的成员名可以与程序中的变量名相同,二者是彼此独立的,互不干扰。,同普通变量一样,仍要求先定义,后使用。 引用方式: 结构体变量名 . 成员名 其中: “ . ” 叫成员 ( 分量 ) 运算符,如:student1.num, student1.addr 等等。 注意: (1) 不能将一个结构体变量作为一个整体进行输入输出,而只能对结构体变量中的各成员分别进行输入输出。 如: printf(“%d,%s,%c,%d,%f,%sn”,student1);不合法。 而: printf(“%sn”,student1.name); student1.num = 10010; 则是合法的。 (2) 新标准C中,允许将一个结构体变量直接赋给另一个同类型的结构体变量。如:student1 = student2; 是合法的。,11.3 结构体类型变量的引用,(3) 若成员本身又属于一个结构体类型,则只能对最低级成员进行存取和运算操作。如:student1 . num, student1 . name, student1 . birthday . month 这些引用均合法。 但不能用student1 . birthday 来试图访问student1 中的成 员birthday 。因为birthday 本身又是一个结构体变量。 (4) 对结构体变量中的成员可以像普通变量一样进行各种运 算(具体哪些运算由其数据类型决定)。 如:student2.score=student1.score; student1.age+ +; 等。 (5) 允许使用结构体变量或其成员的地址。 如:scanf(“%d”,则不合法。,和其它类型变量一样,结构体变量也可以在定义时进行初始化。 如:main ( ) struct student long int num ; char name20 ; char sex ; char addr20 ; a = 89031 , “ Li Lin” , M , “123 Beijing Road ”; printf( “No.:%ldn name:%sn sex:%cn address:%sn”, a . num , a . name , a . sex , a . addr ) ; 运行结果: No: 89031 name: Li Lin sex: M address: 123 Beijing Rood,11.4 结构体变量的初始化,但要注意的是:不能在程序的运行过程中这样赋值。,11.5 结构体数组 所谓结构体数组,即构成数组的每一个元素都是一个结构体类型的数据。这和我们以前学习的各种数据类型的数组概念相同,只是它的数组元素为结构体类型的数据罢了。 11.5.1 结构体数组的定义 1. struct student int num ; char name20 ; char sex ; int age ; float score ; char addr30 ; ; struct student stu3 ;,2 . struct student int num ; . stu3 ;,3 . struct int num ; . stu3 ;,如: struct student int num ; char name20 ; char sex ; int age ; float score ; char addr30 ; stu3 = 10101 , “ Li Lin ”, M , 18 , 87.5 , “ 103 Beijing Road ”,10102 , “Lu Pin”,M, 19 , 95 , “ 130 Shanghai Road ” , 10103 , “Wu Li”,F , 20 , 78, “100 Zhongshan Road ” ;,11.5.2 结构体数组的初始化,以上定义的结构体数组stu的存放格式为:,例11.2 (P266)设已有3个候选人,要求每次输入一个候选人的名字就表示投该候选人一票,最后输出各候选人的得票情况。,stu0,stu1,stu2,stu,struct person char name20 ; int count ; leader3 =“Li”, 0 , “Zhang”, 0 , “Fan”, 0 ; /* 有3个候选人 */ main ( ) int i , j ; char leader_name20 ; for ( i = 0 ; i = 10 ; i + + ) /* 由10个人来投票 */ scanf ( “ %s ” , leader_name ) ; for ( j = 0 ; j 3 ; j + + ) if ( strcmp ( leader_name , leaderj . name) = = 0 ) leaderj . count + + ; printf ( “ %n ” ) ; for ( i = 0 ; i 3 ; i + + ) printf (“%5s : %d n” , leaderi . name , leaeri . count ) ; ,11.6.1 指向结构体变量的指针 一个结构体变量的指针就是该结构体变量所占内存段的起始地址,存放该地址的变量叫做指向结构体变量的指针变量,简称指向结构体变量的指针。 例11.3 (P268)指向结构体变量的指针的应用。,11.6 指向结构体类型数据的指针,main ( ) struct student long int num ; char name20 ; char sex ; float score ; ; struct student stu_1 ; struct student *p ; p = ,89101,“ Li Lin ”,M,89.5,p,stu_1,以上程序的运行结果均为: No.: 89101 No.: 89101 name : Li Lin name : Li Lin sex : M sex : M score : 89.500000 score : 89.500000 说明: 1. 程序中(*p) 表示 p 指向的结构体变量,(*p).num表示 p 指向的结构体变量中的成员num 。第一个printf 是直接访问,第二个printf 是间接访问。 2. (*p).num等效于pnum 。其中称为指向运算符,优先级为1 。 3. 结构体变量中成员的引用有三种等价形式: 1) 结构体变量 . 成员名 2) (*p) . 成员名 3) p成员名 4. 注意区分:pn 表示得到p 指向的结构体变量中的成员n 的值。 pn + + 表示先用p 所指向的结构体变量中的成员n 的值,然后使其值加1 。 + + pn 表示先使p 所指向的结构体变量中的成员n 的值加1 ,然后再引用其值。,11.6.2 指向结构体数组的指针 例11.4 (P269) struct student int num ; char name20 ; char sex ; int age ; ; struct student stu3 = 10101 , “Li Lin”, M , 18 , 10102 , “Zhang Fan” , M , 19 , 10104 ,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号