用户自定义的数据类型,对于一般的数据类型有整型, 字符型,浮点型。
相同的数据类型往往有着相同的大小和编码方式
数组是一种比较特殊的数据类型,由于一个数组变量是由多个变量组成的,因此称其为构造数据类型
C中主要有三种自定义的数据类型,结构型,联合型和枚举型
结构型:struct Student
{
char name[20];
int age;
char sex;
}stu1,stu2 ;
结构型中可以有任意的基本数据类型,这是与数组这样的构造数据类型有区别的地方
如果想要访问其中的元素,数组通过下标进行访问,而结构体则是通过 . (成员操作符)
例如定义一个struct Student stu1 变量,stu1就是struct Student 类型的变量,stu1.age即可访问姓名
需要注意的是,成员操作符拥有最高的优先级
如果后面的程序中不再使用结构型的名称,则可以在写结构体的时候在最后一个花括号和分号间写变量的名称
即定义了一个匿名的结构体
struct
{
char name[20];
int age;
char sex;
}stu1,stu2;
结构型指针变量
struct Student
{
char name[20];
int age;
char sex;
struct Student *pstu;
};
这里struct Student *pstu就是定义了一个指向结构体的指针类型
如果想让这个指针指向结构型变量: struct Student stu1,*pstu;
pstu=&stu1;
访问内部成员时,可以用stu1.age,也可以用(*pstu).age或者pstu->age
与数组不同的是,两个类型相同的结构体之间是能够进行赋值的,即使结构体中有数组,赋值操作也能正常进行
另外,由于结构体是由多个成员变量组成,为了提高传参效率,常把形参的类型由结构型改为指向该结构型的指针类型。
例如: void init(struct Student stu),这样传参如果stu中数据类型比较多,会导致传参效率下降
void init(strcut Student *pstu),如此,就必须传递一个struct Student 类型的指针进来,无论什么类型的指针都是4个字节的
大大提高效率。
---------------------------------------------------------------------------------------------------------------------------------------------------------
下面讲讲联合型:
union data
{
double f;
int i;
};
其与结构型的格式类似,不同之处在于联合型是共享一个存储单元的,编译时系统只分配给能存放成员中长度最长的变量存储空间供所有成员变量共享使用,因此也称为共用型
虽然共享内存但是不会出现覆盖现象,如先输入整型,在输入双精度浮点型
然后我假设整型占据整数部分,浮点型的小数部分私有,那
事实证明,float并不是2.2
最后,我先输入双精度浮点型,再输入整型
都得到了自己输入的结果。
如果先输出整型,再输出浮点型,再输出刚才的整型
整型的数值发生了改变,
如果先输出浮点型,再输出整型,再输出浮点型呢
这个差别不是很大,我认为对于浮点型来说后四位,按照浮点数编码方式来说是表示的精度,而前四位中保存的是范围,如果不是输入很大的整数,对浮点数而言影响不大