简单的数据类型通常不能满足大型项目开发的要求,项目中的一些对象的属性繁多而复杂,这个时候就需要定义一个更多元化的数据类型,使程序参数化,更简洁,更形象。
类型定义符
定义一个新的类型的形式:
typedef 类型名 标识符
typedef struct linkman
{
int num;
char name[16];
char addr[16];
char phoneNum[16];
}LMAN;
其实这是将一种已经合法存在于C语言的类型定义为一个新名字类型的过程,比如实例中我们就将这个结构体定义为了一个新的类型LMAN,通常这个新类型的名字用大写标识。跟宏定义不同,typedef关键字表示的类型定义不是在预处理的时候进行的,而是在编译的时候进行的。类型定义便于程序移植。
结构体
结构体定义
struct 结构体
{
类型名1 成员表名1;
类型名2 成员表名2;
类型名3 成员表名3;
......
};
实例:
struct linkman
{
int num;
char name[16];
char addr[16];
char phoneNum[16];
};
结构体变量的定义有两种方式:
- 先定义结构体类型,再定义结构体变量
- 在定义结构体的同时定义结构体变量
下面是实例
//方式一:
struct linkman
{
int num;
char name[16];
char addr[16];
char phoneNum[16];
};
struct linkman man1,man2;
//方式二
struct linkman
{
int num;
char name[16];
char addr[16];
char phoneNum[16];
}man1,man2={2,"zhang san","beijingshi","18888888888"};
结构体数组定义
结构体数组变量的定义与普通结构体变量的形式差不多,结构体指针指向了一块存储结构体的数据块,下面是实例(包括数组成员的初始化):
struct linkman
{
int num;
char name[16];
char addr[16];
char phoneNum[16];
}man[2]={{1,"li si","shanghaishi","18666666666"}},{2,"zhang san","beijingshi","18888888888"}},*ptr;
struct linkman *p;
//指针以如下方式引用成员
(*p).num=1;
//or
p->name[0]='\0';
//->运算符优先级大于++/--运算符
结构体引用
-
结构体变量的引用
同类型的结构体变量之间可以相互赋值;可以直接通过取结构体变量地址对变量数据进行操作;结构体变量可以作为函数的参数和返回值。 -
结构体成员的引用
结构体变量名.成员名注意:对结构体的字符串赋值不能采用 “结构体变量名.成员名=” 的形式,只能在初始化的时候定义,或者采用标准输入的方式对他复制。
结构体变量构成链表
链表结构体通常由两部分组成,一部分储存数据,一部分存储指针指向下一部分数据。
联合体
联合体的定义
我们将存放在同一段内存单元当中的不同数据类型的数据的集合,称为联合体。这些数据的起始地址是一样,也就是覆盖存储。这几个数据占用了同一块内存。
union 联合体名{
类型名1 成员表名1;
类型名2 成员表名2;
类型名3 成员表名3;
...
}
union linkmans{
int addr[16];
char nameList[16];
}a;
union linkmans b,c;
//联合体变量成员的幅值与调用
联合体变量名.成员名
联合体注意事项
- 不可以使联合体的变量名进行赋值操作
- 不可以对联合体变量做初始化赋值,赋值只能在程序中进行
- 一个联合体变量每次只能赋予一个成员值,也就是联合体变量的值就是联合体变量某一个成员的值。
通过联合体的这些特殊之处可以看出,联合体跟结构体不同,联合体不是将多个成员装在同一个单元内,而是,联合体同一个时刻只属于其中的某一个成员。
联合体变量的地址就是其成员的地址。给联合体预留的内存空间大小的算法与结构体一致(内存对齐),但是使用sizeof得到的联合体大小是成员中最大的那个成员的内存大小值。
结构体内存大小计算法则
以定义式的第一个成员地址为起始计算;
其他的成员变量地址的起始偏移量是某一个数的整数倍,这一个数可以称之为对齐数,它是一个取决于环境默认值和成员类型的值(VS环境默认为8,Linux环境默认为4),每个成员变量都有一个对齐值,等于编译器环境默认值与成员大小的较小值;
结构体有一个最大对齐数,是其所有成员对齐数的最大值,结构体的大小是其最大对齐数的整数倍,结构体变量作为嵌套结构体成员的时候,其对齐数为其最大对齐数。
这一段我存在一个疑惑:在我用windows的DEV C++进行试验的时候,我采用了一个大小为16的数据类型long double,最后的输出结果显示,long double的对齐数应该为16。