zoukankan      html  css  js  c++  java
  • 函数指针与指针函数

    1.函数指针

    指向函数的指针。本质是一个指针。

    指针变量可以指向变量的地址、数组、字符串、动态分配地址,同时也可指向一个函数,每个函数在编译的时候,系统会分配给该函数一个入口地址,函数名表示这个入口地址,那么指向函数的指针变量称为函数指针变量。

    引论:
    int sumup(int a, float b);
    int (*p3) (int a, float b);    //加入p3=&sumup;则p3作为指针指向sumup。这就是p3指针指向函数
    【回顾:两者的返回值和形参都是  int    (int a, float b);】
    int* (*p4)(int a, float b);
    从类型上看,int*  (int a, float b) 是上式函数的指针。故有:p4 = &p3;

    int (*p) (int x);       // 声明一个函数指针

    //可以通过以下两种方式将func函数的首地址赋给指针p

    p=func; 

    p=&func;

    取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。可以采用如下两种方式来通过指针调用函数:

    x=(*p)();

    x=p();    //虽然看起来和普通的调用无异,但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的

    如使用引论中的例子有如下的调用:
    sumup (100,1.21);
    (*p3) (100,1.21);      //与上等价
    *(p4) (100,1.21);       //与上等价
    

    示例程序:

    void (*funcp)();
    void FileFunc(),EditFunc();
     
    main()
    {
          funcp=FileFunc;
          (*funcp)();
          funcp=EditFunc;
          (*funcp)();
    }
     
    void FileFunc()
    {
         printf(FileFunc
    );
     }
     
    void EditFunc()
    {
         printf(EditFunc
    );
    } 
    程序输出为:
         FileFunc
         EditFunc
    

      

     
     

    2.指针函数

    指带指针的函数,即本质是一个函数函数返回的类型某一类型的指针,即返回一个地址给调用函数,以用于需要指针或者地址的表达式中
    类型标识符  *函数名(参数表)  
    如:
    声明:int * f(x);
    int *p;
    调用:p=f(a);
     
    int * GetDate(int wk,int dy)    //返回某元素的地址
    { 
         static int calendar[5][7]={ 
             {1,2,3,4,5,6,7}, 
             {8,9,10,11,12,13,14},
             {15,16,17,18,19,20,21},             
             {22,23,24,25,26,27,28},              
             {29,30,31,-1}
                 }; 
         return &calendar[wk-1][dy-1];  
    }         
    
    main() 
    {           
       int wk,dy;    
       do      
       {             
           printf(Enter week(1-5)day(1-7)
    );    
           scanf(%d%d,&wk,&dy);        
       }            
       while(wk<1 || wk>5 || dy<1 || dy>7);      
       printf(%d
    ,*GetDate(wk,dy));      
    }
    

      

  • 相关阅读:
    从架构演进的角度聊聊Spring Cloud都做了些什么?
    Spring Cloud在国内中小型公司能用起来吗?
    中小型互联网公司微服务实践-经验和教训
    springcloud(十二):使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪
    springcloud(十一):服务网关Zuul高级篇
    springcloud(十):服务网关zuul初级篇
    springcloud(九):配置中心和消息总线(配置中心终结版)
    [讨论]C++编译/编辑器对OIer的必要功能
    [题解]How Many Tables HDU
    [干货]文件输入输出实例&Ptask的编写
  • 原文地址:https://www.cnblogs.com/simonLiang/p/6054051.html
Copyright © 2011-2022 走看看