目录
11.3.1 摆脱struct关键字:类型定义
定义都要写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; }Date;//声明结构类型Adate,并定义一个结构变量Date 新: typedef struct Adate{ int month; int day; int year; } Date;//这个Date就是新名字 //这样的一个struct 我mine把它命名为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 联合(工具 使用场景)
(一份 选择)
联合是和结构特别像的一个东西
但不同的是,内部的成员看似有两个,实际上你只能选一个,int or char
union AnElt{
int i;
char c;
}elt1,elt2;
elt1.i = 4;
elt2.c = 'a';
elt2.i = 0xDEADBEEF;
//先写入char类型为a,之后用0x...覆盖掉了
概念:
-
存储
- 所有的成员共享一个空间
- 同一时间只有一个成员是有效的(长江后浪推前浪)
- 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;
}