• 理解函数指针(一)


    1.直接调用函数

    void fun(int x); //此处的声明也可写成:void fun( int );
    
    int main(int argc, char* argv[])
    {
        fun(10); //调用函数
    
        return 0;
    }
    
    /*定义*/
    void fun(int x)
    {
        printf(“%d
    ”,x);
    }

    2.函数指针

    void fun(int x); //也可写成:void fun( int );
    void (*fp)( int ); //声明一个函数指针,也可声明成void(*fp)(int x),但一般不这样。
    
    int main(int argc, char* argv[])
    {
       fun(10); //直接调用
       fp=&fun; //将fun函数的地址赋给fp指针变量,如果上边没声明,可以直接void (*fp)(int) = &fun;
       (*fp)(20); //通过函数指针变量fp调用。
    }
    
    /*fun函数*/
    void fun(int x) 
    {
       printf(“%d
    ”,x);
    }

    其实fun函数名是fun函数的头指针,区别是fun是指针常量,而fp是指针变量。和数组的头指针一样的意思。

    所以也可以这样写:

    void fun(int x); //也可写成:void fun( int );
    void (*fp)( int ); //也可申明成void(*fp)(int x),但一般不这样。
    
    int main(int argc, char* argv[])
    {
       (*fun)(10); //直接调用,函数名的指针方式
       fp=fun; //不用加&,
       fp(20); //函数指针的函数名一样的方式
    }
    
    /*fun函数*/
    void fun(int x) 
    {
       printf(“%d
    ”,x);
    }

    因为fun也是函数的头指针,所以(*fun)(10)方式也可以,因为这样写不方便,C语言设计者才设计成fun(10)的方式,所以指针变量fp(10)的方式也是OK的。

    把函数地址赋值给fp时,加不加&都是一样的效果,都是把函数头地址赋值给fp。可通过gdb检测。我测试了。

    注意:

    在声明时:

    void fun( int );    //不能写成void (*fun)( int )。
    void (*fp)( int );   //不能写成void fp( int )。

  • 相关阅读:
    js对象数组(JSON) 根据某个共同字段 分组
    一个 函数 用来转化esSearch 的range 条件
    关于 vuex 报错 Do not mutate vuex store state outside mutation handlers.
    android listview 重用view导致的选择混乱问题
    android SDK和ADT的更新
    Android中adb push和adb install的使用区别
    pycharm中添加扩展工具pylint
    su Authentication failure解决
    Putty以及adb网络调试
    有关android源码编译的几个问题
  • 原文地址:https://www.cnblogs.com/leezhxing/p/4734926.html
Copyright © 2020-2023  润新知