自定义数据类型结构体结构体是程序员在程序中自定义的一种数据类型,在说明和使用之前必须先定义它,也就是构造它。
定义一个结构体的语法格式如下:Struct 结构体类型名{成员1的数据类型名成员1名称;成员2的数据类型名成员2名称;..成员n的数据类型名成员n名称;}结构体变量表={成员初始化};注意成员可以由若干个不同的数据类型组成,每个成员也可以是结构体,即可以嵌套定义。
例如:Struct student{Long num;Char name;Char sex;Float score;};已经定义的某种结构体类型可以视为一种标准的数据类型,它的使用方法与标准数据类型使用方法相同,可以用来定义变量、数组、指针。
结构体变量说明结构体变量的说明在程序的变量说明部分给出,一般在结构定义之后,它的语法格式如下:Struct 结构类型名结构变量名表;例如:Struct student stu;指出了结构变量stu是student类型的变量,它由四个成员组成,每个成员的数据类型和名字都与student结构定义中给出的相同。
系统完全按照结构定义时制定的内存模式为结构变量分配内存空间。
可以在定义结构体类型的同时给出结构体变量。
Struct student{Long num;Cha name[20];Cha sex;Float score;}stu1,stu2;这种形式与前面给出的结构定义和结构说明分开处理效果相同。
结构体成员访问结构体成员是通过结构体变量名和成员名进行访问的,不能把他作为一个整体进行访问。
其访问格式如下:结构体变量名.成员名其中运算符.是成员访问运算符,其运算级别是最高的,和圆括号运算符()、下标运算符[]是同一级别的。
如果结构体成员是指针变量,则访问格式为:*如果某个结构体变量的成员数据类型又是一个结构体,则访问方式为:外层结构体变量名.外层成员名.内层成员名可以在定义结构体变量的同时对结构体变量初始化。
{结构体成员}结构体变量={初始数据};struct student{long num;char name[20];char sex;float score;} stu1={200401L,"ZhangHong",'f',92.5f};对于嵌套的结构体类型数据,访问格式为:结构体变量名1.结构体变量名2.成员名结构体变量初始化的格式如下:struct 结构体名{结构体成员}结构体变量={初始数据};初始数据类型必须与结构成员的数据类型相匹配,并且先后顺序一一对应赋值。
要对结构体变量的成员地址进行访问,其语法格式为:&结构体变量.成员名当一个指针变量用来指向一个结构变量时,称为结构体指针变量。
结构体指针变量中的值是所指向的结构体变量的首地址。
结构体指针变量:Struct 结构名*结构体指针变量名Struct student *pstu;必须先赋值后使用,把结构体变量的首地址赋给指针变量,不能把结构名或结构体变量名赋给指针变量。
pstu=&stu1;结构体名和结构体变量是两个不同的概念,结构体名只能表示一个结构形式,编译系统并不对它分配内存空间,只有当某变量被说明为这种类型的结构时,才对该变量分配存储空间。
这是因为结构体变量被定义后相当于标准数据类型被使用。
利用结构体指针变量访问成员如下:(*结构体指针变量).成员名或者:结构体指针变量->成员名后一种形式较为方便,容易区分。
三种访问结构体成员的方式:结构变量。
成员名(*结构指针变量)。
成员名结构指针变量->成员名结构体与数组相同结构的结构体变量组成的数组,简称结构数组。
Struct student{Long num;Char name[20];Char sex;Struct birthday bir;Float score;}students[35];上面定义了一个结构数组students,共35个元素,students[0]~students[34]。
每个数组元素都具有struct student的结构形式,用来描述一个学生的相关信息。
结构数组名students表示该数组存储的首地址。
结构数组在说明的同时也可以对它进行初始化赋值。
语法格式如下:Struct 结构体名结构数组名[数组长度]={初始数据};与其他数组一样,结构体数组的元素也可以用指针来引用。
但指针应说明为数组元素类型的指针,并将数组名或者数组的第0个元素的地址赋给指针变量。
引用上述结构体数组students元素的指针变量说明如下:Struct student *p=students;或者Struct student *p=&students[0];则p为指向结构数组的指针变量,且p指向该结构数组的0号元素,p+1指向1号元素,p+i指向第i号元素。
(*p).num或p->num表示引用students[0].num(*++p).num或(++p)->num表示引用students[1].numC语言中规定,定义某个结构体时,其成员的类型可以是该结构体本身,但是这个成员只能是指针变量或指针数组,不能使普通变量或数组。
结构体与函数结构体作为函数的参数可以采用三种方式进行传递:将结构体成员作为单独的参数传递给函数;将整个结构体变量作为参数传递给函数;将指向结构体的指针作为参数传递给函数。
链表动态分配内存空间的函数:第一个内存管理函数是非配内存空间函数malloc(类型说明符*)malloc(size);其功能是分配一块长度为size字节的连续内存区域。
函数的返回值为该区域的首地址。
“类型说明符”说明把该区域用于何种类型的指针。
(类型说明符*)表示把返回值强制转换为该类型指针。
Pc=(char*)malloc(100);表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。
第二个内存管理函数为calloc(类型说明符*)calloc(n,size);表示一次分配n块区域。
Ps=(struct student *)calloc(2,sizeof(struct student));第三个内存管理函数为释放内存空间函数free。
Free(void*ptr)其作用是释放ptr所指向的一块内存空间,ptr是任意类型的指针变量,它指向被释放区域的首地址。
被释放的区域应该是malloc或calloc函数所分配的区域。
每一次分配一块空间可用来存放一个学生的信息,可称之为一个结点。
有多少个学生就分配多少块内存空间,也就是建立多个结点。
将若干个结点按一定的原则连接起来的一组数据称之为链表。
链表中的结点之间的联系可以用指针实现。
即在节点结构中定义一个成员用来存放下一个结点的首地址,这个用于存放地址的成员常称之为指针域。
为了确定链表中的第一个结点,需要设置一个指向第一个结点的头指针。
然后依次在第一个结点的指针域内存入第二个结点的首地址,依此类推,最后一个结点因无后续结点连接,其指针域可赋NULL。
链表中的每一个结点都是同一种结构类型。
数据结点定义的语法格式如下:Struct <结点名>{<数据类型名> <变量表>;<结点名> *<结点指针名>;};联合体语法与结构体很相似,但却有不同。
联合体几个成员共享同一个位置开始的存储区,这些成员并不同时存在,而是在不同时刻拥有不同的成员,在同一时刻仅拥有其中一个成员。
因此,联合体变量的存储空间只要保证能存放其中任何一个成员就可以了。
联合体成员的数据类型可以是任何数据类型,联合体在定义、变量说明和使用形式上均与结构体相似,两者本质上的不同仅在于使用内存的方式上。
Union 联合体名{成员1数据类型成员1名;成员2数据类型成员2名;...成员n数据类型成员n名;}联合体变量表={成员初始化};联合体变量说明:Union data ua,ub,uc,*pu,*d[20];上面说明了date联合类型的联合变量ua,ub,uc,联合指针*pu和联合数组d。
联合体成员访问由于联合的各个成员使用相同的开始内存区域,所以联合占用的内存空间在某个时刻只能保证某个成员的数据真实有效。
联合体与结构体的区别(1)从存储结构上来看,结构变量所占的内存长度是每个成员所占的内存长度之和。
每个成员分别占有自己独立的内存单元。
而联合变量所占的内存长度等于最长的成员的长度。
(2)在初始化时,结构体初始化与一维数组类似,而联合只能对第一个成员初始化。
(3)从成员的地址看,结构体各成员的地址互不相同,只有第一个成员的地址与结构变量地址相同(类型不同),联合体所有成员的地址相同,都等于联合变量的地址。
(4)从使用上看,结构体中所有成员可以分别赋值、同时存在、互不影响。
而联合体中通过给某成员赋值,该成员覆盖其他成员,使联合体中始终只能正确保存一个成员的值。
枚举类型enum 枚举类型名{枚举常量表};常量表中的每个常量都是一个标识符。
Enum weekday {SUN,MON,YUE,WED,THU,FRI,SAT};枚举常量不是变量,不能在程序中用赋值语句对它赋值。
但可以在定义枚举类型时对它赋初值。
定义枚举类型时系统自动给每个枚举常量分配一个表示序号的整数值,默认第一个值为0,以后每个标识符的值依次比前面的增加1,。
可以通过赋初值来改变默认值,从赋值以后的标识符开始忍然依次加1。
枚举常量是一个标识符,不是字符常量也不是字符串常量,使用时不要加单引号或双引号。
标准类型别名定义允许程序员为数据类型取别名,这主要是为了便于程序的移植及简化程序书写格式。
Typedef 原类型名新类型名;Type int INTEGER;以后就可以用INTEGER来代替int作整形变量的类型说明了。
但long INTEGER i;这样的定义是错误的,它不像宏定义中的宏名那样作简单的字符串替换。
同样typedef也可以用于定义数组,指针,结构等类型。
Typedef char STRING[20];表示STRING是字符数组类型,长度为20。
STRING a1,a2;等价于:Char a1[20],a2[20];又如:Typedef struct student{Long num;Char name[20];Char sex;Float score;}STU;然后可以用STU来说明结构变量。