• 指针函数与函数指针的区别


       辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。

     

    1、指针函数:本质是一个函数。函数返回类型是某一类型的指针。只是函数的返回值

        格式:  类型标识符    *函数名(参数表)

                       int *f(x,y);

    1
    2
    3
    4
    5
    float *fun();
     
    float *p;
     
    p = fun(a);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    int* find(void);
     
    int * find(){
     
         int *pp ;
          pp= 0;
        return pp;
         
    }
     
    int main(int argc, const char * argv[]) {
     
        int *pp ;
        pp = find();
     
        return 0;
    }

     本质是函数 只是这个函数返回的是一个执行某一类型数据的指针;

    2、函数指针是指向函数的指针变量,即本质是一个指针变量。-指向的是函数的实现地址

         格式:类型说明符 (*函数名)(参数)

                    int (*f) (int x); 

        指向函数的指针包含了函数的地址,可以通过它来调用函数

       其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数实现地址。指针的声明笔削和它指向函数的声明保持一致。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int  xMax(int a,int b){
        return a>b?a:b;
         
    }
    int main(int argc, const char * argv[]) {
     
         
        int (*xMaxValue)(int a,int b) = &xMax;// &可以省略
         
        int d = xMaxValue(xMaxValue(2,4),3);
        printf("最大的数字是: %d ", d);
    }

       

      指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。

    3、回调函数

    函数指针作为某个函数的参数

    函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。

    简单讲:回调函数是由别人的函数执行时调用你实现的函数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    // 回调函数
    void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
    {
        for (size_t i=0; i<arraySize; i++)
            array[i] = getNextValue();
    }
      
    // 获取随机值
    int getNextRandomValue(void)
    {
        return rand();
    }
      
    int main(void)
    {
        int myarray[10];
        populate_array(myarray, 10, getNextRandomValue);
        for(int i = 0; i < 10; i++) {
            printf("%d ", myarray[i]);
        }
        printf(" ");
        return 0;
    }
  • 相关阅读:
    Java Lambda表达式初探
    什么时候使用CountDownLatch
    Spring官网改版后下载
    JAVA多线程实现的四种方式
    Java四种线程池的使用
    CentOS配置本地yum源(使用镜像iso文件)
    深入浅出解析大数据平台架构
    How Kafka’s Storage Internals Work
    Understanding Kafka Consumer Groups and Consumer Lag
    Understanding, Operating and Monitoring Apache Kafka
  • 原文地址:https://www.cnblogs.com/jack-hzm/p/9950477.html
Copyright © 2020-2023  润新知