玩转C语言之自定义数据类型-typedef

5 篇文章 0 订阅
本文详细介绍了C语言中的typedef关键字,如何通过typedef为已有数据类型赋予新名,提升代码可读性。涵盖典型应用场景,如局部类型名、简化类型名和通用类型定义,同时对比typedef与#define的区别,以及在多源文件中的应用。
摘要由CSDN通过智能技术生成

玩转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

typedefC 语言中的类型命名关键字,通过这个关键字可以对类型赋予新的名字。其语法结构如下:

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 有利于程序的通用与移植

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值