结构体•数组作为一种构造型数据类型,为将多个相关数据作为一个整体处理提供了方便。•但是,数组只能按序组织多个相同类型的数据,当需要将若干不同类型的相关数据作为整体处理时,就需要使用另外一种构造型数据类型——结构体。structStudent{charname[20];intnum;charsex;intage;charaddress[30];};•例如,一个学生的姓名(name)、学号(num)、性别(sex)、年龄(age)、家庭住址(address),构成了这个学生档案的基本信息,若要将name、num、sex、age、address分别定义为相互独立的简单变量,难以反映出它们之间的内在联系,而通过使用结构体类型就可以将它们作为一个整体来处理。一般形式为:struct结构体类型名{类型名1成员名1;类型名2成员名2;…类型名n成员名n;};struct是结构体类型的标志。结构体名是由用户定义的标识符,它规定了所定义的结构体类型的名称。结构体类型的组成成分成为成员,成员名的命名规则与变量名相同。structStudent{charname[20];intnum;charsex;intage;charaddress[30];};结构体类型变量的定义练习:定义一个结构体类型structstudent,要求包括学生姓名、学号、数学成绩、英语成绩、计算机成绩、总分、邮政编码、通讯地址。定义结构体类型,只说明了该类型的组成情况,编译系统并没有给它分配内存空间。只有当定义属于结构体类型的变量时,系统才会分配存储空间给该变量。声明结构体变量有以下三种方法。——以上面定义的stu为例来加以说明。1.先定义结构,再说明结构变量。如:structStu{charname[20];intnum;charsex;intage;charaddress[30];};structStuboy1,boy2;说明了两个变量boy1和boy2为stu结构类型。结构体变量占用的内存空间是其成员所占内存之和。structStudent{charname[20];intnum;charsex;intage;charaddress[30];};structstuboy1,boy2;因此Student占用的内存空间为20+4+1+4+30=59个字节。结构体变量中的各成员在内存中按定义的顺序依次排列。在定义变量时,structStrudent必须一起使用。2.在定义结构类型的同时说明结构变量。例如:structstu{intnum;charname[20];charsex;floatscore;}boy1,boy2;这种形式的说明的一般形式为:struct结构名{成员表列}变量名表列;3.直接说明结构变量。例如:struct{intnum;charname[20];charsex;floatscore;}boy1,boy2;这种形式的说明的一般形式为:struct{成员表列}变量名表列;在结构体类型定义中要注意以下几点:1、结构体类型定义中不允许对结构体本身的递归定义。(指针例外)structperson{charname[20];intage;charsex;floatheight;structperson*per;}2、结构体类型定义中可以包含另外的结构体,即结构体是可以嵌套的。structdata{intyear;intmonth;intday;};structperson{charname[20];charsex;structdatabirthday;floatheight;};结构变量的初始化:和其他类型变量一样,对结构变量可以在定义时进行初始化赋值。【例】对结构变量初始化。intmain(){structstu/*定义结构*/{intnum;char*name;charsex;floatscore;}boy2,boy1={102,Zhangping,'M',78.5};boy2=boy1;return0;}对结构体变量,在初始化时,应将各成员所赋初值依照结构体类型说明中成员的顺序依次放在一对大括号中,不允许跳过前面的成员给后面的成员赋值,但可以只给前面若干个成员赋初值,后面未赋初值的成员中,数值型和字符型的数据,系统自动赋值零。结构体变量成员的引用1、可以将结构体变量的值赋给另一个具有相同结构的结构体变量;2、可以引用一个结构体变量中的一个成员的值;引用的一般形式为:结构体变量名.成员名其中,“.”是成员运算符;3、如果成员本身也是一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一层的成员;4、不能将一个结构体变量作为一个整体进行输入和输出,只能对结构体变量中的各个成员分别进行输入和输出;5、对结构体变量的成员可以像普通变量一样进行各种运算;6、可以引用结构体变量成员的地址,也可以引用结构体变量的地址。指向结构变量的指针•结构指针变量定义的一般形式为:struct结构名*结构指针变量名例如,在前面的例题中定义了stu这个结构,如要说明一个指向stu的指针变量pstu,可写为:structstu*pstu;•赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。如果boy是被说明为stu类型的结构变量,则:pstu=&boy是正确的,而:pstu=&stu是错误的。•结构指针变量访问结构变量的各个成员,其访问的一般形式为:(*结构指针变量).成员名或为:结构指针变量-成员名例如:(*pstu).num或者:pstu-num•应该注意(*pstu)两侧的括号不可少,因为成员符“.”的优先级高于“*”。如去掉括号写作*pstu.num则等效于*(pstu.num),这样,意义就完全不对了。C语言允许用typedef说明一种新类型名,来代替已有类型名,形式为:typedef类型名标识符;其中,类型名是在此语句前已有定义的类型标识符,标识符是用做新类型名的用户定义标识符。例如,typedeffloatREAL;typedefchar*PCHAR;该语句将用户命名标识符REAL说明成了一个float型的类型名,此后可以使用新类型名REAL定义float型的变量。例如:REALa,b;等价于floata,b;PCHARp;等价于char*p;也就是说typedef并未产生新的数据类型,它的作用仅仅是给已存在的类型名起一个“别名”,且原有类型名依然有效。通常可以按下列步骤来说明一个新类型名:1、按通常定义变量的方法写出定义的主体:如:int*p;2、用新类型名取代变量名:如:int*PCHAR;3、在左面加上关键字typedef:如:typedefchar*PCHAR;此后就可以用新类型名去定义变量了。如:PCHARp;若有:structnode{intdata;structnode*next;};typedefstructnodeSTNODE;则:STNODEh;等价于structnodeh;