今天写程序时,在DSP2833x_PieVect.h看到typedef interrupt void (*PINT)(void)突然一愣,上网查了下发现在这是加了interrupt 中断关键字的函数指针,顺便记一下并复习一下函数指针。

本文参照下面的博客整理而来

http://blog.csdn.net/lg2lh/article/details/7459138

函数型指针 
       一个函数被执行时,在程序空间中占据一定空间,这个空间的起始地址是用函数名来表示的,称为函数的入口地址。也可以用指针指向这个入口地址,并通过该指针变量来调用这个函数。这种指针变量称为函数型指针变量,其一般形式为: 
    数据类型标识符 (*指针变量名) (); 
例如:int (*f)(); 
      上式定义了指针f, f指向的函数并返回整型类数据。注意其中(*f)中的括弧不可缺少,标识f是先与*结合,是指针变量,然后再与后面的()结合,表示此指针指向函数。

在281x C中(),还增加了interrupt 中断关键字(见下面的内容),因此可定义如下数据类型:

 typedef interrupt void (*PINT)(void); 

     在上句中,定义了指针PINT为指向一个特殊的函数interrupt型函数的指针类型。由于在使用interrupt时,函数应被定义成返回void,而且无参数调用,因此在(*PINT)的后面加上(void),表示PINT是指向函数的指针,且无参数调用。在(*PINT)的前面加上interrupt void,表示PINT指向中断函数,无参数返回值。这样,在描述PIE中断矢量表时,可以定义如下的结构:

typedef interrupt void(*PINT)(void);// Define Vector Table:
struct PIE_VECT_TABLE {// Reset is never fetched from this table.
// It will always be fetched from 0x3FFFC0 in
// boot ROM
PINT     PIE1_RESERVED;PINT     PIE2_RESERVED;PINT     PIE3_RESERVED;PINT     PIE4_RESERVED;PINT     PIE5_RESERVED;PINT     PIE6_RESERVED;PINT     PIE7_RESERVED;PINT     PIE8_RESERVED;PINT     PIE9_RESERVED;PINT     PIE10_RESERVED;PINT     PIE11_RESERVED;PINT     PIE12_RESERVED;PINT     PIE13_RESERVED;    .....    ......

即该结构体的元素为函数指针类型 ,注意这里的interrupt只是说明PINT是指向中断函数类型指针。如果没有interrupt,typedef void (*PINT)(void),则PINT还是表示指向函数的指针类型。只是不属于中断函数。

        其中,PIE_VECT_TABLE是一个结构类型,其中的所有成员均为中断函数的首地址,即指向中断函数的指针。因此,在定义其成员如PIE1_RESERVED等时,要在其前面加PINT,表示PIE1_RESERVED是PINT类型的变量,即指向中断函数的指针。这样程序显得比较简洁。

  理解复杂声明可用的“右左法则”:从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。举例:

  int (*func)(int *p);

  首先找到变量名func,外面有一对圆括号,而且左边是一个*号,这说明func是一个指针;然后跳出这个圆括号,先看右边,又遇到圆括号,这说明(*func)是一个函数,所以func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值类型是int。

  int (*func[5])(int *);

  func右边是一个[]运算符,说明func是具有5个元素的数组;func的左边有一个*,说明func的元素是指针(注意这里的*不是修饰func,而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结合)。跳出这个括号,看右边,又遇到圆括号,说明func数组的元素是函数类型的指针,它指向的函数具有int*类型的形参,返回值类型为int。


转载于:https://www.cnblogs.com/ylhwx/p/7767922.html

typedef interrupt void (*PINT)(void)的分析相关推荐

  1. typedef void(*Fun)(void);

    今天在SDK中看到了这么个写法: typedef void(CALLBACK *DisplayCBFun)(long nPort,char *pBuf,long nSize,long nWidth,l ...

  2. void start_kernel(void)分析 ! \linux-1.0\init\main.c

    //启动系统内核 //asmlinkage 为通过堆栈传递参数,默认为通过寄存器传递参数. asmlinkage void start_kernel(void) { /** Interrupts ar ...

  3. void init(void) 分析 ! \linux-1.0\init\main.c

    void init(void) {int pid,i;//设置环境信息setup((void *) &drive_info);//打印提示语句sprintf(term, "TERM= ...

  4. void (*fun)(void);什么意思?

    void (*fun)(void); 查阅资料得知这句代码的意思是: 定义一个函数指针. 比如:定义一个指向函数的指针,该函数有一个整形参数并返回一个整型值 int(*fun)(int): 再比如原来 ...

  5. [转]C/C++语言void及void指针深层探索

    1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧. 2 ...

  6. C/C++语言void及void指针深层探索 .

    1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧. 2 ...

  7. void和void*详解 v2

    void的含义 void即"无类型",void *则为"无类型指针",可以指向任何数据类型. void指针使用规范 ①void指针可以指向任意类型的数据,亦即可 ...

  8. void与void*详解

    void关键字的使用规则: 1. 如果函数没有返回值,那么应声明为void类型: 2. 如果函数无参数,那么应声明其参数为void: 3. 如果函数的参数可以是任意类型指针,那么应声明其参数为void ...

  9. C语言 void和void *(无类型指针)

    void 关键字 void的字面意思是"无类型",void *则为"无类型指针",void *可以指向任何类型的数据. void几乎只有"注释&quo ...

最新文章

  1. Invoke()/BeginInvoke()区别
  2. 【Flutter】Icons 组件 ( FlutterIcon 下载图标 | 自定义 svg 图标生成 ttf 字体文件 | 使用下载的 ttf 图标文件 )
  3. AI:一张高清长图教你读懂AI简史《1308年 → 至今》
  4. Spring bean三种创建方式
  5. np变题了。但我过了
  6. LeetCode 1170. 比较字符串最小字母出现频次
  7. Linux磁盘及文件系统(二)Linux下磁盘命名和分区
  8. SSL:Self-Supervised Learning(自监督学习)是什么?
  9. Web前端工作笔记005---浏览器内核介绍
  10. Delphi 包的设计思想及它与PAS、BPL、DCU、DLL、OXC的关系
  11. QGIS插件开发详细教程
  12. D社创始人 苟方韬:当二次元恋上区块链,如何引爆流量
  13. macOS 安卓模拟器 Genymotion 安装
  14. cython使用说明
  15. Redmi 游戏电视 X Pro 评测
  16. ArcGIS Pro教程 | 1#数据准备
  17. java 微信公众号之授权登录
  18. 软件测试可以做到多大岁数?
  19. 微信WiFi认证的解决方案
  20. 从传统投放走向程序化购买, 浅谈户外广告发展前景

热门文章

  1. 海思3536:交叉编译Qt4.8.4
  2. 计算机辅助焊接过程控制,重型车辆计算机辅助焊接工艺自动设计系统.pdf
  3. python爬取电影评分_用Python爬取猫眼上的top100评分电影
  4. oracle bl编译,使用 PL/SQL 条件编译
  5. php与nginx通讯方式,[Linux]PHP-FPM与NGINX的两种通讯方式
  6. jsp java数据,jsp怎么遍历数据
  7. linux清屏命令_linux下的7个常用命令的基本使用
  8. mimo的误码率_揭晓MU-MIMO黑科技!
  9. 计算机用英语bos,宏基电脑boss界面英文翻译,不知道的可以看看。
  10. Solr 中遇到的问题