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

玩转C语言之自定义数据类型-typedef相关推荐

  1. 易语言数据类型与c 对照,易语言利用自定义数据类型和数组. 制作键对值操作类/内存配置...

    易语言利用自定义数据类型和数组.  制作键对值操作类/内存配置.版本 2 .支持库 spec .子程序 _临时子程序 .局部变量 test, classKeyValue .局部变量 局_取值方法2,  ...

  2. C语言_自定义数据类型

    目录 1.自定义数据类型_结构体 1.1 结构体类型的声明 1.1.1 匿名结构体 1.2 结构体的自引用 1.2.1 Typedef结构体重命名: 1.3 结构体变量的定义和初始化 1.4 结构体内 ...

  3. C语言之——自定义数据类型

    目录 前言:什么是自定义数据类型 ? 一,自定义数据类型之:数据类型命名 1,深入应用typedef: 二,自定义数据类型之:结构体类型命名 1,深入理解struct结构体: 三,自定义数据类型之:联 ...

  4. 易语言 取自定义数据类型的大小

    先说一下易语言的变量储存机制 易语言有基本数据类型和复合数据类型两种 基本数据类型包括:1. 各种整数 2.各种浮点 3. 逻辑值 他们都是储存在栈上的 大小都是固定的 用不着取 复合类型一般储存在堆 ...

  5. 易语言调用c 自定义数据类型,跟我入门易语言 14 自定义数据类型

    自定义数据类型是一种特殊的数据类型,它与我们之前学习过的常见数据类型不同,我们自己也可以自己创建数据类型!一个自定义类型可以由许多成员组成,每一个成员可以是各种常见数据类型,甚至一个自定义数据类型中还 ...

  6. 易语言自定义数据类型转c,一步一步跟我学易语言之自定义数据类型

    自定义数据类型 什么是"自定义数据类型"?顾名思义,就是用户可以随时在程序中自行定义新的数据类型.自定义数据类型时需要设置数据类型的名称及其成员.数据类型成员各属性的设置方法等同于 ...

  7. 自动生成员工号c语言,C语言自定义数据类型

    C语言自定义数据类型 第7章 自定义数据类型7.1 结构体类型 7.2 共用体 7.3 枚举类型 7.4 用typedef声明类型C+提供了许多种基本的数据类型(如int.float. double. ...

  8. 【剑仙教程】易语言的结构体。自定义数据类型。

    1楼. [剑仙教程]易语言的结构体.自定义数据类型. 在易语言中,有基本数据类型,自定义数据类型. 自定义数据类型,在C语言/C++中称为结构体.这是面向对象和类的编程. . . 先上代码.打开易语言 ...

  9. 剑仙java_【剑仙教程】易语言的结构体。自定义数据类型。

    1楼. [剑仙教程]易语言的结构体.自定义数据类型. 在易语言中,有基本数据类型,自定义数据类型. 自定义数据类型,在C语言/C++中称为结构体.这是面向对象和类的编程. . . 先上代码.打开易语言 ...

最新文章

  1. 性能测试---商场模型分析
  2. CVPR2020 | 商汤-港中文等提出PV-RCNN:3D目标检测新网络
  3. 使用POI创建word表格-在表格单元格中创建子表格
  4. OpenCV中Mat类的重载运算符operator()的用法
  5. 计算机软件出版,[计算机软件及应用]出版信息管理系统.doc
  6. Linux环境用Sendmail架设Mail服务器
  7. 「深圳云栖大会」大数据时代以及人工智能推动下的阿里云异构计算
  8. 机器学习基础(二十二)—— decision tree
  9. 机器学习-数据科学库-day1
  10. ZOJ 4067 Books (2018icpc青岛J) (贪心)
  11. Pytorch——用50行代码搭建ResNet
  12. python题目-青蛙跳井口
  13. Sentaurus入门(3):sde
  14. tf.nn.tanh 双曲正切曲线
  15. 关于egret引擎游戏开发的笔记-1
  16. win7 usb功能被禁用的解决方法
  17. 592. Fraction Addition and Subtraction
  18. MLC转成SLC模式没有想象的那么好
  19. 中产学院全国首创7大黄金技术桂林游学发布会
  20. Python根据字幕文件自动给视频添加字幕(通用版)

热门文章

  1. python数字编码_Python 编码为什么那么蛋疼?
  2. python enumerate用法_【Python】python enumerate用法总结
  3. 两个服务器之间怎么传输大量数据速度快 java socket_一口气说出Kafka为啥这么快?...
  4. web自动化如何在不同浏览器运行_Web自动化测试:元素的基础操作和浏览器基础操作...
  5. matlab优化工具箱
  6. 2017年10月08日普及组 蜡烛
  7. python画图标题为蓝色_python绘制语谱图怎么设置成黄蓝色
  8. protobuf message定义_巧用 Protobuf 反射来优化代码,拒做 PB Boy
  9. php结尾的链接_优化 PHP 代码建议(结尾有彩蛋)
  10. oss上传文件不能在浏览器直接打开_OSS使用Bucket域名访问直接下载不能打开网页的解决方法...