• 函数指针与指针函数


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

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

    示例程序:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    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);
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    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));     
    }

      

  • 相关阅读:
    博客作业03--栈和队列
    博客作业02---线性表
    博客作业01-抽象数据类型
    C语言最后一次作业--总结报告
    C语言博客作业--函数嵌套调用
    java课程设计——2048
    博客作业06--图
    博客作业05--查找
    博客作业04--树
    博客作业03--栈和队列
  • 原文地址:https://www.cnblogs.com/tcam/p/6058643.html
Copyright © 2020-2023  润新知