ARM学习易搞混的:函数指针和指针函数

发布者:genius5最新更新时间:2017-11-12 来源: eefocus关键字:ARM  函数指针  指针函数 手机看文章 扫描二维码
随时随地手机看文章

    在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,和大家的一些总结,整理到此,和大家分享。
    首先它们之间的定义:
    1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针
    类型标识符*函数名(参数表)
    int*f(x,y);
    
    首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。
    表示:
    float*fun();
    
    
    float*p;
    
    
    p=fun(a);
    
    
    注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。
    来讲详细一些吧!请看下面
    指针函数:
    当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。
    格式:
    类型说明符*函数名(参数)
    当然了,由于返回的是一个地址,所以类型说明符一般都是int。
    例如:int*GetDate();
    int*aaa(int,int);
    
    函数返回的是一个地址值,经常使用在返回数组的某一元素地址上。
    int*GetDate(intwk,intdy);
    main()
    {
    intwk,dy;
    do
    {
    printf(Enterweek(1-3)day(1-4)/n);
    scanf(%d%d,wk,dy);
    }
    while(wk1||wk3||dy1||dy4);
    printf(%d/n,*GetDate(wk,dy));
    }
    int*GetDate(intwk,intdy)
    {
    staticintcalendar[3][4]=
    {
    {1,2,3,4},
    {5,6,7,8},
    {9,10,11,-1}
    };
    returncalendar[wk-1][dy-1];
    }
    
    
    程序应该是很好理解的,子函数返回的是数组某元素的地址。输出的是这个地址里的值。
    2、函数指针是指向函数的指针变量,即本质是一个指针变量。
    int(*f)(intx);/*声明一个函数指针*/
    f=func;/*将func函数的首地址赋给指针f*/
    指向函数的指针包含了函数的地址,可以通过它来调用函数。声明格式如下:
    类型说明符(*函数名)(参数)
    其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明笔削和它指向函数的声明保持一致。
    指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。
    例如:
    void(*fptr)();
    
    把函数的地址赋值给函数指针,可以采用下面两种形式:
    fptr=Function;fptr=Function;
    
    
    取地址运算符不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。
    可以采用如下两种方式来通过指针调用函数:
    x=(*fptr)();
    x=fptr();
    
    第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。下面举一个例子:
    void(*funcp)();voidFileFunc(),EditFunc();
    main()
    {
    funcp=FileFunc;
    (*funcp)();
    funcp=EditFunc;
    (*funcp)();
    }
    voidFileFunc()
    {
    printf(FileFunc/n);
    }
    voidEditFunc()
    {
    printf(EditFunc/n);
    }
    程序输出为:
    
    
    
    FileFunc
    EditFunc
    
    
    主要的区别是一个是指针变量,一个是函数。在使用是必要要搞清楚才能正确使用
    回复数字看华清远见精选
    回复18:程序员接私活怕被坑?华仔教你轻松签单!
    
    回复19:7个致命的Linux命令,你都知道吗?
    回复20:做到这些,阿里巴巴的大门就离你不远了!
    回复21:7条有趣的Linux命令,不信你试试!
    回复22:15道非常经典的Java面试题,值得收藏!
    回复23:大神从不需要GUI:Linux生存指南
    回复24:某大型IT企业HR亲授面试技巧,赶快来试试!
    温馨提示:还可尝试回复数字“0-17”,也许会有惊喜哦!

关键字:ARM  函数指针  指针函数 引用地址:ARM学习易搞混的:函数指针和指针函数

上一篇:ARM中异常中断问题分析总结
下一篇:嵌入式程序员需了解的几种ARM调试方法

推荐阅读最新更新时间:2024-03-16 15:44

采用ARM9微处理器的嵌入式Web服务器设计方案
1.ARM简介 广义地讲,凡是带有微处理器的专用软硬件系统都可以称为嵌入式系统。它是嵌入到对象体系中的专用计算机系统,以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。目前非常流行的ARM内核有ARM7TDM1、S t r o n g A R M 、A R M 7 2 0 T 、A R M 9 T D M 1 、ARM920T、ARM940T、ARM946T、ARM966T、ARM10TDM1等。本文所讨论的目标板的CPU为ARM920T内核的三星S3C2410芯片。 ARM9系列微处理器主要应用于无线设备、仪器仪表、安全系统、机顶盒、高端打印机、数字照相机
[单片机]
采用<font color='red'>ARM</font>9微处理器的嵌入式Web服务器设计方案
ARM 异常介绍
一、中断概念: CPU 在执行当前程序的过程中因硬件或软件的原因插入了另一段程序运行的过程 硬件引起的中断不可预测,随机性 软中断:事先在程序中安排特殊指令,CPU 执行到该类指令时,转去执行相应的一段预先安排好的程序,然后再返回来执行原来的程序 二、ARM 体系异常分类: 复位异常(Reset) 数据异常(Data Abort) 快速中断异常(FIQ) 外部中断异常(IRQ) 预取异常(Prefetch Abort) 软中断异常(SWI) 未定义异常(Undefined interrupt) 三、异常处理伪代码及 7 种异常 异常处理伪代码: R14_ exception_mode = return link SPSR_
[单片机]
基于ARM的家用智能垃圾桶设计
    随着人们生活水品的不断提高,在人们购买各种家具或家电时越来越重视其智能化和人性化。人们在生活中产生的生活垃圾都需用垃圾桶放置,考虑到老人、孕妇或者残疾人,放置垃圾时存在的不便、费时、费力等问题。设计针对这些问题,提出了具有语音识别功能的智能垃圾桶设计方案,当用户想要扔垃圾时,只要一声令下,垃圾桶就会快速准确地来到你身边。 1 系统硬件设计     系统硬件包括垃圾桶车体机械结构和硬件控制电路两个部分。其中车体机械结构为一部三轮小车车体,能按照在不同地点处用户发出的声音指令,自动行驶到用户所在地。系统硬件电路总体结构框图如图1所示,包括电源模块、ARM最小系统、声源定位模块、语音识别模块、避障模块和电机驱动模块。  
[单片机]
基于<font color='red'>ARM</font>的家用智能垃圾桶设计
ARM 汇编器对C的扩展
__swi void ledtest(); //:声明 edtest 是个软中断。 __asm 内嵌汇编 //:通常在C程序里面需要嵌入汇编代码,这是就可以用__asm关键字来指示编译器下面的代码是用汇编语言来写的, __inline 定义内联函数 //:就像在C语言中用define定义宏一样,用__inline关键字定义的函数在调用的地方被展开,这主要就是为了解决频繁的函数调用开销过大的问题,如果用__inline关键字定义的函数过大,每个调用函数的地方都会将其展开,这样的话在一定程度上也增加代码量,所以说一般用__inline 定义的函数代码量并不是很大。 由于在C语言中无法直接访问COSR, 因此需要通过嵌入
[单片机]
移动处理器大象之战,Intel与ARM谁将胜出?
  英特尔(Intel)与 ARM 目前已经在系统领域正面冲突,谁会胜出?有分析师认为英特尔赢面仍大,但也有分析师不这么认为。   “到目前为止,英特尔一直没赶上超移动(ultramobile)市场的热潮,看来在 2011年也无法取得这方面的动力。”投资顾问机构Piper Jaffray 的分析师Auguste Gus Richard在最近发表的一篇报告中指出:“英特尔的问题是,越来越多软件开发商将焦点集中在 ARM 平台,随着这股力量不断成长,相关应用程序日益增加,英特尔越来越难扭转市场的方向。”   还有另一个问题是:“我们不看好英特尔的32纳米智能手机处理器平台Medfield能在2011上半年问世,或是在2011年、甚
[半导体设计/制造]
ARM GPIO接口置位方法
如下面的代码,为啥把端口SDA付给SDA就是置位操作呢? 其实SDA是一个偏移量,它基于GPIO_PORTB_BASE,进行偏移,SDA定义的就是某一个管脚,如 #define SDA 0x20H 这是16进制数,展开为二进制则是0010 0000B, 可见,偏移量0x20H,其实也可以用来置位,因为第六位为1。再看GPIOPinWrite()函数,第三个参数就是SDA的值,要知道,函数赋值,最小都是char类型,一个字节,你无法赋值一个bit,所以,既然这样,就干脆就用偏移量赋值就行了(函数的实现,可能通过&或者|)。 所以,某些ARM编程的书籍上说要把某个GPIO的值赋值给它本身,我当时就很不解,为啥要赋值给它本身?其实就是因
[单片机]
ARM开发板启动流程(从NandFlash启动)
S3C2440从nandflash启动依赖片内部件SDRAM(Stepping Stone)大小4KB位于ARM空间的0地处。Nandflash不能参与统一编址,在地址空间以外。处理器上电时会自动从Nandflash最前端拷贝出4KB的内容复制到SteppingStone中,接着PC指针指向0地址即StepingStone中所保存的第一条指令。除去4KB剩下的代码从Nandflash拷贝到内存当中。 S3C6410上电后首先运行SROM里的bootloder0,bootloder0将会从Nandflash最前端拷贝出8KB的内容到SRAM当中。剩余的拷贝到内存里。
[单片机]
ARM11处理器实现90nm工艺下750MHz性能
ARM公司日前宣布了一项具有突破性高性能的ARM1176JZF-S处理器的实现,通过使用ARM Artisan Advantage单元库及内存,这一处理器的频率在90纳米代工厂工艺下超过了750MHz,芯片面积却仅为2.4平方毫米。这一性能的显著提升得益于协作设计、先进的物理IP以及处理器技术的共同贡献。最优化后的实现为现有的应用及操作系统带来了业界领先的超过920 Dhrystone MIPS的性能表现,而不需要任何昂贵的软件再设计或再编译费用。 ARM市场营销和业务开发高级副总裁Mike Inglis表示:“将业界领先的ARM处理器业务以及通过一年前收购Artisan获得的物理IP业务合并在一起的举措现在已经在技术上和商业上
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved