目录
11.3.1 类型定义
每次定义都要写struct。累不?烦不?好消息好消息,现在起,用自定义数据类型,立马解君愁!
自定义数据类型(typedef)
- C语言提供了一个叫做typedef的功能来声明一个已有的数据类型的新名字
-
typedef int Length; 这样就使得Length成为了int类型的别名, 此时Length可以代替int出现在变量定义和参数声明的地方,如 Length a=10; Length number[10];
声明新的类型的名字,作为某种类型的别名,大大改进了可读性
typedef 原来的类型名 新类型名
如果原类型名很长,只需要看最后的单词来判断
原来:
struct Adate{
int month;
int day;
int year;
};
新:
typedef struct Adate{
int month;
int day;
int year;
} Date;//这个Date就是新名字
Date d1={9,1,2015};
等价于
struct Adate d1={9,1,2015};
举几个例子:
typedef *char[10] Strings;
//Strings是10个字符串的数组类型
typedef struct node{
int data
struct node *next;
}aNode;
//aNode是新名字
typedef struct node aNode;
//aNode是struct node的新名字
11.3.2 联合
联合是和结构特别像的一个东西
union AnElt{
int i;
char c;
}elt1,elt2;
elt1.i = 4;
elt2.c = 'a';
elt2.i = 0xDEADBEEF;
//先写入char类型为a,之后用0x...覆盖掉了
但不同的是,内部的成员看似有两个,实际上你只能选一个,int or char
-
存储
- 所有的成员共享一个空间
- 同一时间只有一个成员是有效的
- union的大小是它最大的成员(如int和char,大小为(sizeof)int)
- 初始化时,对第一个成员做初始化
常见的使用场景(得到整数内部的每个字节程序)
#include<stdio.h>
typedef union{
int i;//如果改为float、double等,全部替换就可以了
char ch[sizeif(int)];
} CHI;
//起个别名为CHI
int main()
{
CHI chi;
int i;
chi.i = 1234;
//初始化为1234,对应的十六进制为0x04D2
for(i=0; i<sizeof(int); i++)
{
printf("%02hhX",chi.ch[i]);
//以两位十六进制整数输出,不足补0
}
printf("\n");
//程序输出为 D2 04 00 00
return 0;
}