用户自定义数据类型
C提供一些已定义的数据类型:int,float等,可以用于解决一般问题,也允许用户根据需要自己建立一些数据类型,用其定义变量,以解决复杂问题。
结构体变量
C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,称为结构体(structre)。在其他高级语言中称为“记录”(record)。
结构体类型定义 struct 结构体名{成员表列};
struct 结构体名
{成员表列};
//结构体类型的名字是由一个关键字struct和结构体名组合而成的。
//结构体名(结构体标记)是由用户指定的,习惯性首字母大写,以区别于其他结构体类型
//花括号内是该结构体所包括的子项,称为结构体的成员(member)
//对各成员都应进行类型声明,即:类型名 成员名;
//成员表列也称为域表,每一个成员是结构体中的一个域。成员名命名规则同变量名。
//成员可以属于另一个结构体类型。
//结构体类型不分配存储单元。
定义结构体类型变量 结构体类型名 结构体变量名;
1.先声明结构体类型,再定义该类型的变量
结构体类型名 结构体变量名;//较为灵活,可声明后随时定义,结构清晰适合大程序
//计算机对内存的管理是以“字”为单位,大多4个字节为一个字。
//因此sizeof运算符测量struct长度得到的是4的倍数
2.在声明类型的同时定义变量
struct 结构体名
{
成员表列
}变量名表列;//比较直观,适合小程序
3.不指定类型名而直接定义结构体类型变量
struct
{
成员表列
}变量名表列;//指定无名结构体类型,无法再以此类型定义变量,不常用
//类型与变量不同!只能对变量赋值存取运算,不能对类型进行这类操作。类型不分配空间
//结构体类型中成员名可以与程序中变量名相同,但两者代表不同对象。
//对结构体变量中的成员“域”,可以单独使用,作用地位相当于普通变量。
结构体变量的初始化和引用
在定义结构体变量时,可以对它初始化,即赋予初始值。然后可以引用这个变量。
1.定义结构体变量时可以对它的成员初始化。初始化列表是用{}括起来的一些常量,这些常量依次赋给结构体变量中的各成员。//初始化的是变量,不是类型!!!
C99标准允许对某一成员初始化,如:
struct Student b={.name=“ye”};
//成员名前有成员运算符“.”,“.name”隐含代表结构体变量b.name。其他未被指定初始化的数值型成员被系统初始化为0,字符型初始化为’\0’,指针型为NULL。
2.可以引用结构体变量中成员的值,引用方式:结构体变量名.成员名。//.优先级最高
//不能企图输出结构体变量名来达到输出结构体变量所有成员的值。
//只能对结构体变量中的各个成员分别进行输入和输出。
如果成员本身又属一个结构体类型,则要用若干个成员运算符,找到最低一级地成员。只能对最低级的成员进行赋值或存取以及运算。
对结构体变量的成员可以像普通变量一样进行各种运算。
同类型的结构体变量可以互相赋值。
可以引用结构体变量成员的地址,也可以引用结构体变量的地址。
//结构体变量的地址主要用作函数参数,传递结构体变量的地址。
结构体数组 结构体类型 数组名[数组长度];
1.声明时定义
struct 结构体名
{成员表列} 数组名[数组长度];
2.先声明后定义
结构体类型 数组名[数组长度];
3.对结构体数组初始化的形式是在定义数组后加上: ={初值表列};
结构体指针 结构体类型 *指针名
结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是它的指针。
若把一个结构体变量的起始地址放在一个指针中,这个指针指向该结构体变量。
指向结构体对象的指针变量既可指向结构体变量,也可指向结构体数组中的元素。
指向结构体变量的基类型必须与结构体变量的类型相同。
引用结构体变量中成员的值,如果p指向一个结构体变量stu,以下3种用法等价:
结构体变量名.成员名 (如stu.num)
(*指向结构体变量名的指针).成员名 (如(*p).num)
指向结构体变量名的指针->成员名 (如p->num)
//“->”指向运算符 *p两旁括号不能省略
可以用指针变量指向结构体数组的元素。
不能指向数组元素的某一成员。若要将某一成员赋给它,可以用强制类型转换。
指针执行p++时,p的值增加了结构体类型的长度。
将一个结构体变量的值传递给另一个函数的方法:
用结构体变量的成员做参数 值传递
用结构体变量作实参 值传递 这种传递方式在时间和空间上开销较大,一般不采用
用指向结构体变量(或数组元素)的指针作实参,将结构体变量(或数组元素)的地址传给形参。