玩转C语言之自定义数据类型-typedef
1 引言
引言:在C语言中没有提供字节类型,如果在工程中需要使用表示字节的变量时,该怎么办呢?
我们知道 1 个字节占用 8 个二进制位空间,解决这个问题的办法就是找个占用 8 个二进制位的内存空间的类型即可。
令我们开心的是, char
类型占用的内存空间正是 1 个字节,因此可以用 char
类型表示字节类型。
由于 char
类型表示的数值范围是 [-128, 127],1 个字节表示的范围是 [0, 255],为了能够完全代替,我们使用 unsigned char
代表一个字节类型,unsigned char
表示的数值范围正是 [0, 255]。
那么我们如果定义一个字节类型的数据,通过下面的方式即可:
unsigned char byte;
通过上面这种方式,总是感觉怪怪的,因为不能够清晰的看出 byte
是一个字节类型的数据。如果是我们自己阅读代码的话,还是能够明白怎么回事的,但是身处这个开源、分享的领域,那么对于同行来说,他们就很难读懂我们的代码。
因此,为了解决这个问题,那么有请这篇文章的主人公闪亮登场——typedef
。
2 什么是 typedef
typedef
是 C
语言中的类型命名关键字,通过这个关键字可以对类型赋予新的名字。其语法结构如下:
typedef Type NewTypeName;
Type
为已有的数据类型Name
为这个数据类型的新名字
注意:
typedef
并没有创建新的数据类型,而是对已有的数据类型赋予新的名字而已!!!
下面通过一个示例,练习一下 typedef
关键字的使用。
typedef unsigned char byte;
int main()
{
byte b= 128;
printf("sizeof(byte) = %d\n", sizeof(byte));
printf("b = %u\n", b);
return 0;
}
3 typedef 的应用
对于 typedef
的应用,在下面的场合中用的比较多:
typedef
在函数中定义“局部类型名”typedef
简化类型名(如:unsigned long long
)typedef
定义类型名,能够以统一的方式创建变量(Type var;)
typedef 的应用方法
- 先按定义变量的方法写出定义体
- 将变量名换成新类型名
- 在最前面加上
typedef
- 然后可以用新类型名定义变量
按定义变量的方式,把变量名换上新类型名,并且在最前面加
typedef
,即声明了新类型名代表原来的类型。
(1)命名一个新的类型名代表结构体类型
typedef struct
{
int month;
int day;
int year;
} Date;
上面声明了一个新类型名
Date
,代表一个结构体类型,可以使用新的类型名定义变量,如:
Date birthday;
Date *p;
(2)命名一个新的类型名代表数组类型
typedef int Num[100];
Num a;
(3)命名一个新的类型名代表指针类型
typedef char *String;
String p, s[10]; // p 为字符指针变量,s 为字符指针数组
(4)命名一个新的类型名代表指向函数的指针类型
typedef int (*P)();
P p1, p2;
下面通过两个例子,加深一下 typedef
的应用:
demo one
#include <stdio.h>
typedef unsigned char byte;
// 在函数的内部创建类型的新名字
// 这种情况下是具有局部的特性,出了这个函数就没有作用了
void func()
{
typedef byte uint8;
uint8 var = 200;
printf("sizeof(uint8) = %d\n", sizeof(uint8));
printf("var = %u\n", var);
}
int main()
{
byte b = 128;
func();
printf("sizeof(byte) = %d\n", sizeof(byte));
printf("b = %u\n", b);
return 0;
}
demo two
#include <stdio.h>
// 为 float[5] 定义新的名字为 fArray5
typedef float(fArray5)[5];
// 为 int(int, int) 定义新的名字为 iFuncII
typedef int(iFuncII)(int, int);
float array[5] = {0.1, 0.2, 0.3, 0.4, 0.5};
int add(int a, int b)
{
return a+b;
}
int main()
{
// 定义一个名为 pa、元素类型为 float、元素个数为 5、值为数组 array 的地址的数组指针
fArray* pa = &array;
// 定义一个名为 pf 的指针
iFuncII* pf = add;
int i = 0;
for(i=0; i<5; i++)
{
printf("%f\n", (*pa)[i]);
}
printf("%d\n", pf(i, i+1));
return 0;
}
4 typedef 用法进阶
(1)typedef
与 #define
的区别
#define
是在预编译时处理的,只能作简单的字符串替换typedef
是在编译阶段处理的
(2)当不同源文件中用到同一类型时,常用 typedef
声明一些数据类型,可以把所有的 typedef
名称声明放在一个头文件中,然后在需要的文件中通过 #include
指令将其包含到文件中
(3)使用 typedef
有利于程序的通用与移植