如何理解typedef关键字

【C语言 C++】简单关键字Register,Const,Static,Volatile,typedef,Define的理解 Register     用register声明的变量称着寄存器变量,在可能的情况下会直接存放在机器的寄存器 中;但对32位编译器不起作用,当global optimizations(全局优化)开的时候,它会做出 选择是否放在自己的寄存器中;不过其它与register关键字有关的其它符号都对32位编译 器有效。 Const      被const修饰的东西都受到强制保护,可以预防意外的变 阅读详情

前言

最近准备开始总结一些东西,当遇到C语言中的typedef时,回想起当时学的时候遇到了一些误区,这里分享出来供大家参考。

typedef可能导致的误区

在我们初学的时候,无非就是类似像下面这样使用typedef关键字。

#include <stdio.h>
typedef int INT;
typedef struct test
{
  int a;
  int b;
}Test;
int main()
{
  ...
}

可能久而久之就将其理解为typedef就是替前面的类型声明一个别名而已。

但是当我们看到这样的用法typedef void (*FUNC)(int),其中void (*FUNC)(int)是一个函数指针,可能再按照上面前后关系这种思维就无法明白这条语句到底干了什么,是将void声明成(*FUNC)(int)?还是将void (*FUNC)声明成(int)?其实都不是。看下面的一个简单样例。

#include <stdio.h>

typedef void (*FUNC)(int);
void test(int num)
{
  printf("%d\n", num);
  return;
}
int main()
{
  int num = 1;
  FUNC print_num = test;
  print_num(num);
  return 0;
}

对比不使用typedef关键字时:

#include <stdio.h>

void (*func)(int);
void test(int num)
{
  printf("%d\n", num);
  return;
}
int main()
{
  int num = 1;
  func = test;
  func(num);
  return 0;
}

正确的理解

首先我们再回到最初那个例子,typedef int INT;,当我们去掉typedef时,为int INT;,这是一个普通的声明变量的语句;而去掉typedef struct test { int a; int b; }Test;中的typedef时,为struct test { int a; int b; }Test;,相当于声明了一个类型为struct test的变量Test。

当我们加上typedef时,原本语句声明的变量变成了该变量类型的别名。

有了这样的认知,我们再回到typedef void (*FUNC)(int)这条语句上,在上面的例子中,去掉typedef后是void (*FUNC)(int),相当于声明了一个函数指针,加上了typedef即代表给void (*)(int)这样一个函数指针类型声明了一个别名叫做FUNC。

事实上,这样的做法也是信号机制中信号捕捉函数sighandler_t signal(int, sighandler_t)的做法,sighandler_t为typedef void (*sighandler_t)(int)。

下面再给出一个例子帮助理解:

#include <stdio.h>
typedef int ARRAY[20];
int main()
{
  ARRAY a;
  printf("%d\n", sizeof(a));
  return 0;  
}

如果你认为输出是4,那你可能还没有理解。此时的变量a已经是一个长度为20的整型数组了。

【学习记录】IIC驱动ICM42670+卡尔曼滤波+四元数姿态角解算 ICM42670陀螺仪可以使用iic驱动,单片机平台使用GD32f305VE。 阅读详情

相关推荐

半导体制造技术导论(第二版)萧宏 第五章集成电路加热工艺答案

第二次退火是在较高温度下进行,并将电阻系数较高的c49碳化硅转变为电阻系数较低的c54碳。水平式高温炉加热、垂直式高温炉加热(即传统的管式炉加热)、快速加热工艺RTP、激光镭射。8. 集成电路芯片制造过程中,会使用垫底氧化层、阻挡氧化层、栅氧氧化层、屏蔽氧化层和全。氧化是最重要的加热过程之一,是一种添加工艺,将氧气加入到硅晶圆后,在晶圆表面形成二氧。为了满足元器件性能的要求,必须利用退火工艺将晶格的损伤修复,使其恢复单晶结构并激活掺。工艺氮气气流下将晶舟推入炉管,升高温度,稳定温度;

goal_achieving的博客 1864

C语言之解析

概述    C语言像一把雕刻刀,锋利,并且在技师手中非常有用。和任何锋利的工具一样,C会伤到那些不能掌握它的人。本文介绍C语言伤害粗心的人的方法,以及如何避免伤害。 [1]0 简介     C语言及其典型实现被设计为能被专家们容易地使用。这门语言简洁并附有表达力。但有一些限制可以保护那些浮躁的人。一个浮躁的人可以从这些条款中获得一些帮助。     在本文中,我们将会看一看这些未可知的益

网络空间安全与企业信息化 3562

基于CH32X035的USB双K型热电偶温度计:硬件设计、冷端补偿与信号放大详解

本文详细介绍了基于CH32X035单片机设计USB双K型热电偶温度计的完整方案。重点解析了硬件设计中的核心挑战:如何利用精密运放GS8552-SR进行信号放大,以及采用NTC热敏电阻和查表法实现精确的冷端补偿。项目通过USB供电通信,实现了双路高精度温度测量与显示,为电子爱好者和工程师提供了实用的参考设计。

weixin_42153793的博客 160

C++中typedef void (*func)的理解 以及 函数地址的概念

首先明确,这是一个函数指针!本质是:指针! 1、指针函数 先将简单的,下列例子是一个指针函数(即:这个函数返回一个指针类型),这里只给一个例子,学过指针的都应该很容易理解。 int *fun(); int *p; p = fun(); 2、函数指针 这就是标题所示的知识点,它是一个指针,指针,指针!一个可以调用多种函数的指针。来看一个例子: //这里有两个函数 void apple(vo...

wch0lalala的博客 4359

Java8对接三方流式接口,并实时输出(GPT)

【代码】Java8对接三方流式接口,并实时输出(GPT)

m0_58617940的博客 1728

Arm A-profile架构RAS系统设计:可靠性、可用性与可服务性解析

在计算机体系结构中,可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)是构建高可信系统的核心要素。RAS系统通过硬件错误检测、隔离和恢复机制,确保系统持续稳定运行。其技术原理包括ECC内存纠错、冗余执行单元和错误传播阻断等关键技术,可显著降低数据中心等关键业务场景的故障率。现代芯片设计中,Arm A-profile架构提供标准化的RAS框架,涵盖从内存子系统到计算单元的全方位错误管理。通过分层防御策略和统一错误记录格式,实现硬件错误可追溯、可修复。

weixin_30920853的博客 358

进阶typedef用法

1、在编程中使用typedef目的一般有两个 一个是给变量起一个容易记住且有意义明确的别名 另一个是简化一些比较复杂的类型声明 int (*ptr)[3]; 数组指针(先是指针,再是数组) typedef int (*PTR_TO_ARRAY)[3]; 栗子1: #include<stdio.h> #include<stdlib.h> typedef int (*PTR_TO_ARRAY)[3]; int main() { int array[3] = {1

m0_53630259的博客 416

RK平台以太网设置中添加代理设置

以太网中配置Configuration的时候可以IpConfiguration的初始化函数来设置代理类型和代理参数。通过添加一个KEY_ETH_PROXY的选项来设置代理的配置,然后再设置以太网静态或者动态的类型时候下发给系统进行设置。

Android系统开发笔记 656

typedef关键字

**typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 使用typedef目的一般有两个,一个是给变量一个容易记并且意义明确的新名字,另一个是简化一些比较复杂的类声明。 在单片机开发中需要配置一些寄存器,(8位、16位、32位),在这里typedef可以简化名字。 比如 typedef unsigned char u_int8; //8位无符号数 typedef unsigned short int

学习记录,交流学习 796

【QT/C++】事件过滤器之基于重写 eventFilter 方法的多种常见应用场景及实现

Qt事件过滤器通过重写eventFilter方法实现多种实用功能:1)鼠标事件处理(点击全选文本、禁用滚轮、悬停提示);2)键盘事件处理(输入内容限制、快捷键提交);3)焦点事件处理(自动弹出下拉框、实时验证);4)绘图事件处理(自定义控件绘制);5)窗口事件处理(防止意外关闭、尺寸限制)。事件过滤器提供非侵入式的事件处理方案,相比传统子类化方式更灵活,通过installEventFilter安装到目标控件即可实现各种交互增强功能。

yuhuasheng1997的博客 1484

Qt入门教程【高级控件篇】QModelIndex索引

QModelIndex索引

小鱼酱的博客 4466

【C语言】typedef关键字

   typedeftypedeftypedef 关键字是用来给其他变量类型改名的关键字,C语言允许用户使用 typedeftypedeftypedef 关键字来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等。一旦用户在程序中定义了自己的数据类型名称,就可以在该程序中用自己的数据类型名称来定义变量的类型、数组的类型、指针变量的类型与函数的类型等。定义如下: 案例: 运行结果:    给结构体变量起名字,取代了

qq_62361050的博客 1139

QGIS003:【02标注工具栏】-标注的样式、放置和属性修改

摘要:文本介绍了QGIS标注的样式、放置和属性修改

qq_31762031的博客 1917

typedef关键字的理解

    今天看了一下linux系统中的一些头文件,发现有些内容是比较难理解的。比如typedef和#define。    首先,我们看看#define这个关键字,#define关键字主要是用来给常用的字符串起个好记的名字,实现文字内容的替换。例如:#define PI 3.1415926     //给3.1415926这个常见的值起了一个名字为PI,以后在程序中输入PI,那么它就是3.1

deven的专栏 569

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

对typedef关键字的理解

C语言对于typedef的学习总结

White_Five的博客 185

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

关键字typedef的简单理解

typedef与#define不同,在其受限范围内,typedef比#define更灵活 typedef并没有创建任何新的类型,它只是为某个已经存在的类型增加了一个方便使用的标签 以 typedef char * arr为例 没有typedef关键字,编译器只是把arr识别为一个指向char的指针变量,此时它不能作为实参传递给以指向char指针作为形参的函数,因为它是变量,不是标识符。而有了typedef关键字,编译器则把arr解释成一个类型的标识符(注意这里是标识符,标识符,可以通过标识符访..

Sky*殇的博客 1961

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

learn_C_deep_10 extern在多文件下的理解、struct 关键字的理解与柔性数组、union 的内存级布局理解、enum 关键字的基本理解、typedef 的理解与分类、关键字总结

存储关键字,不可以同时出现,也就是说,在一个变量定义的时候,只能有一个。

qq_64446981的博客 982

c语言的typedef关键字深入理解

运行后打印结果为:valueOne is 50, valueTwo is 50从现象上来看,typedef好像的确和#define干了一件一样的事情,那就是给已有类型重新取了个名字。

m0_73320835的博客 486

c语言typedef关键字的理解

  1.typedef的定义   很多人认为typedef 是定义新的数据类型,这可能与这个关键字有关。本来嘛,type 是数据类型的意思;def(ine)是定义的意思,合起来就是定义数据类型啦。   不过很遗憾,这种理解是不正确的。也许这个关键字该被替换为“typerename”或是别的词。 typedef 的真正意思是给一个已经存在的数据类型(注意:是类型不是变量)取一个别名,而非...

weixin_34129696的博客 391

C中关键字typedef、stasic的理解 4.9

1.关键字typedef typesef的功能是对一个类型进行重定义,也可以说是将类型的名称简化,如下图所示 若此工程中需重复使用unsigned int,一直将unsigned int作为类型的名称就会比较麻烦,所以将unsigned int重定义或者说重命名为u_int,就会省去一些不必要的麻烦。 2.关键字static static——静态的 关于static,有三种用法 (1)修饰局部变量 (2)修饰全局变量 (3)修饰函数 下面一一进行讲解 修饰局部变量 如下图,函数输出的结果为5个1,跳

aaaaaaaWoLan的博客 368

C语言中的关键字-typedef之理解和使用

C语言中如何使用typedef关键字来定义自己习惯的类型名称

_IronMan's 博客 732

深入理解c++中.h/.cpp文件,extern关键字,typedef,using关键字

源文件是代码的“具体实现”。它包含了所有在头文件中声明的实体所对应的完整定义。源文件中应该包含什么?头文件的包含:#include "my_header.h",以获取所有声明。函数的完整定义类成员函数的完整实现全局变量的定义(这是该变量唯一被分配内存的地方)为什么要这么做?每个 .cpp 文件都被编译器单独编译成一个目标文件(.o 或 .obj)。这些目标文件包含了实际的机器码。

cyz322649的博客 1432

深入理解C语言中的typedef关键字:类型重命名和代码组织

本文旨在深入探讨C语言中的typedef关键字,为开发者提供关于其在类型重命名和代码组织方面的全面理解。文章首先概述了typedef关键字的定义和基本用法,随后详细分析了它在不同上下文中的具体应用,包括类型重命名和自定义数据类型。最后,通过技术总结,强调了typedef在编程中的重要性。typedef是C语言中的一个修饰符,用于为现有类型创建一个新的别名。它在不同的上下文中具有不同的作用和意义。以下是typedef类型重命名typedef。

极客代码 1348

转——C/C++中typedef关键字的深入理解

第一、四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,&nbsp; // 和一个字符变量; 以下则可行: typedef char* PCHAR; // 一般用大写 PCH...

onlyTbabm的博客 278
上一篇: SGISTL源码探究-配接器
下一篇: C++中对象与成员函数的联系
UKey_
博客等级 码龄10年 258粉丝 186原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值