C语言入门学习笔记之typedef简介

 更新时间:2021年11月10日 15:43:47   作者:嵌入式@hxydj  
typedef为C语言的关键字,作用是为一种数据类型定义一个新名字,下面这篇文章主要给大家介绍了关于C语言入门学习笔记之typedef简介的相关资料,需要的朋友可以参考下

在单片机和操作系统中 typedef 会经常用到,它可以为某一个类型自定义名称。和#define比较类似。但是又有不同的地方。

  • typedef 创建的符号只能用于数据类型,不能用于值。而#define 创建的符号可以用于值。
  • typedef 是由编译器来解释,而不是预处理器。
  • typedef 使用起来更加灵活。

下面使用typedef定义一个数据类型

int main()
{
	typedef unsigned char BYTE;	
	BYTE c = 10;	
	printf("%d \r\n",c);
	
	system("pause");
	return 0;
}

使用typedef将unsigned char类型重新定义为BYTE类型,然后在使用新的类型BYTE定义一个变量c。输出结果如下:

此时如果使用 #define 来替换,好像也可以。

这里使用 #define 将unsigned char替换为 BYTE好像也正确。

下面在看一个例子。

int main()
{
	typedef char * STR;		
	STR s1,s2;	
	s1="abc";
	s2="123";		
	printf("%s %s \r\n",s1,s2);	
	system("pause");
	return 0;
}

将字符指针 char * 重新定义为STR类型,然后使用STR定义两个指针s1和s2,这样s1和s2都是指向字符的指针。接着给这两个指针赋值,然后打印出来。

这时使用 #define 来替换 typedef 的功能。

#define STR  char *
int main()
{
	STR s1,s2;	
	s1="abc";
	s2="123";	
	printf("%s %s \r\n",s1,s2);	
	system("pause");
	return 0;
}

这时候编译程序的时候,程序会报错。

这时为什么呢?因为使用typedef的时候,是定义了一个新的数据类型。

typedef char * STR;		
STR s1,s2;	

相当于

char *s1, *s2;
s1="abc";
s2="123";	

s1和s2都是指向字符类型的指针。

如果使用 #define 的时候,系统只是简单的替换。

#define STR  char *
STR s1,s2;	

将STR用 char * 进行替换

	char *s1,s2;	
	s1="abc";
	s2="123";	

替换后只有s1是指针,s2依然是一个char类型的变量。所以给s2赋值一个字符串的时候系统就会报错。因此要重新定义一个数据类型的时候,要使用typedef,这个在定义结构体的时候使用的非常多。

typedef struct Date
{
	int year;
	int month;
	int day;
} DT;

使用typedef 将结构体 struct Date 重新定义为DT类型,这样在使用DT定义变量的时候,就相当于使用了 struct Date 来定义变量。

typedef struct Date
{
	int year;
	int month;
	int day;
} DT;

DT d1 = {2021,10,1};
DT d2 = {2021,10,10};

等价于

struct Date
{
	int year;
	int month;
	int day;
};
struct Date d1 = {2021,10,1};
struct Date d2 = {2021,10,10};

这样通过使用 typedef 来重新定义一个新的类型,使代码写起来更加的简洁。这种方法在单片机的库函数中使用的最多。

typedef struct
{
    uint16_t GPIO_Pin;          
    GPIOSpeed_TypeDef GPIO_Speed; 
    GPIOMode_TypeDef GPIO_Mode;    
}GPIO_InitTypeDef;

void LED_Init(void)
{ 
 	GPIO_InitTypeDef  GPIO_InitStructure;
 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;				 			//LED0-->PA8 端口配置
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		  //推挽输出
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		  //IO口速度为50MHz
 	GPIO_Init(GPIOA, &GPIO_InitStructure);					 				/PD2 输出高 
}

通过 typedef 将结构体重定义为GPIO_InitTypeDef 类型,这样在初始化的时候,直接使用GPIO_InitTypeDef 类型就可以定义一个关于GPIO的结构体。

在定义数据类型的时候,也会用到 typedef 重新定义一个数据类型。

通过tepedef 定义新的数据类型,增加了代码的可读性和移植性。这里说的新的数据类型不是创建了一个系统不存在的数据类型,而是给已经存在的某个类型增加了一个方便使用的标签。而这个标签又不同于 #define 只是简单的符号替换。

总结

到此这篇关于C语言入门学习笔记之typedef简介的文章就介绍到这了,更多相关C语言typedef简介内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现餐饮管理与点餐系统

    C语言实现餐饮管理与点餐系统

    这篇文章主要为大家详细介绍了C语言实现餐饮管理与点餐系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • C语言指针笔试题全面解析

    C语言指针笔试题全面解析

    这篇文章主要介绍了C语言指针笔试题全面解析,介绍了其相关概念,然后分享了几种用法,具有一定参考价值。需要的朋友可以了解下。
    2021-09-09
  • C语言实现投票系统

    C语言实现投票系统

    这篇文章主要为大家详细介绍了C语言实现投票系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • QT实现简单音乐播放器

    QT实现简单音乐播放器

    这篇文章主要为大家详细介绍了QT实现简单的音乐播放器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • 用C语言来实现一个简单的虚拟机

    用C语言来实现一个简单的虚拟机

    这篇文章主要介绍了用C语言来实现一个简单的虚拟机,其中栈数组的部分非常值得学习,需要的朋友可以参考下
    2015-07-07
  • Matlab控制电脑摄像实现实时人脸检测和识别详解

    Matlab控制电脑摄像实现实时人脸检测和识别详解

    人脸识别过程主要由四个阶段组成:人脸检测、图像预处理、面部特征提取和特征识别。这篇文章主要介绍了如何使用MATLAB控制笔记本电脑的摄像头,并进行实时人脸检测和识别,需要的可以参考一下
    2022-10-10
  • c++11中std::move函数的使用

    c++11中std::move函数的使用

    本文主要介绍了c++11中std::move函数的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Visual Studio调试C/C++教程指南

    Visual Studio调试C/C++教程指南

    VisualStudio是微软开发的一款集成开发环境软件,本文主要介绍了Visual Studio调试C/C++教程指南,熟悉地掌握基于VS的C/C++调试技术,可以大幅提升调试性能,感兴趣的可以了解一下
    2024-06-06
  • C++实现Matlab的zp2tf函数的示例代码

    C++实现Matlab的zp2tf函数的示例代码

    matlab 的 zp2tf 函数的作用是将极点形式的 H(s) 函数的分母展开,本文主要为大家介绍了C++实现Matlab的zp2tf函数示例代码,需要的可以参考一下
    2023-04-04
  • Qt使用QCamera实现切换相机,分辨率和图像捕获功能

    Qt使用QCamera实现切换相机,分辨率和图像捕获功能

    这篇文章主要为大家介绍了如何利用Qt中的相机类QCamera,取景器类QCameraViewfinder,图像捕获类QCameraImageCapture实现切换相机、分辨率和图像捕获功能,需要的可以了解一下
    2023-04-04

最新评论