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

    函数指针数组

    语文要学好.
    这三个词我们扩充一下

    数组 int Array[N];
    指针的数组 int *Array[N];
    函数的指针的数组 int (*function_pointer)[N](int,int);
    

    按照中文的习惯,函数指针数组应该就是函数的指针的数组的简写了.

    从低级一点点进化到高级

    数组

    int a[2];
    数组就是这样,没什么好说的了.就是有两个格子,里面存了两个int类型的数字.这两个格子被看成a.大小使用sizeof(a)来计算,就是两个int的大小.约定一个int大小是4个字节,那么sizeof(a)就是8个字节大小了.
    

    指针的数组

    int *p[2];
    难度加大了一点,但是我们冷静一下,还是可以理解的.这还是一个数组,还是两个格子,每个格子里存的是指向int类型的指针.每个指针的大小也约定是4个字节.那么sizeof(p);也就是8个字节了.
    格子p1,格子p2  这两个格子分别指向int类型的数字. `p1->&a;p2->&b;` 指针->这个符号是指针专用的.只有指针才能使用->.
    

    函数的指针的数组

    按照道理里将应该写成 `int (*func)(int a)[2];`,但是应该写成`int (*fp)[N](int, int);`
    开始变得有意思了.我们读一下这个东西.首先看哪里呢?我们先不看哪里,我们先来把这一大串东西分解一下.
    int  (*func)[2] (int a);好了,这么一看就明白了.
    先读标识符,和他相邻的是指针符号,那么func是一个指针,然后往右,是个数组,那么func应该指向一个数组.那这个数组里存的是什么样的东西呢?
    存的是 参数是一个int,返回值是一个int类型的函数.意思是这两个格子里存的是两个函数的地址.
    

    解释函数指针

    我尝试说明一下这个类型是什么,为什么有这样的类型.

    参数是一个int,返回值是一个int类型的函数 的类型

    看到类型这两个字,你是怎么理解的?
    在我看来,类型就是模型,就是模板,是一个蓝图,一个模具.
    模具有什么特点?我们有一个米老鼠的模具,使用橡皮泥塞进去,就能倒出来一个米老鼠了.
    如果别人拿了一个不一样的米老鼠过来,你使用这个模具是不能卡进去的.但是使用这个模具倒出来的米老鼠是正好可以卡进去的.

    函数的类型就是描述这个函数长什么样子.描述的要素有:返回值类型 参数个数及其类型. 只要这三个方面一一匹配,我们就函数是同一个类型的.
    比如 int (*func)(int a, int b); 这就是一个函数模板,我们可以把这样的函数叫做米老鼠模板.

    如果不给这个模板起名字,我们就说形如这样的函数就叫做 返回值是一个int类型的指针,参数为int a, int b的类型.
    这么叫是不是太费劲了?现在我们就给它起名字叫米老鼠.
    使用typedef来进行起名字.
    typedef int (*milaoshu)(int a, int b);
    好了,现在我们定义了一个新的函数指针类型叫milaoshu. milaoshu类型是一个指向 返回值是int 的有两个int参数的函数 的指针的类型.
    那我们就使用这个milaoshu类型进行声明吧.
    milaoshu p = NULL;
    我们声明了一个milaoshu类型的指针变量p.
    这个p目前是指向空的.
    除了指向空,它还可以指向milaoshu的类型.
    那就是p = func;
    调用方式 p(a,b) 就等同于func(a,b);

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef int (*milaoshu)(int a, int b);
    
    int func(int a, int b){
        return a+b;
    }
    int main() {
    
        int a = 10;
        int b = 20;
        printf("a+b = %d
    ", a+b);
        milaoshu p;  //如果不给这个类型起名叫米老鼠,那么在声明变量p的时候应该这样声明 int (*p)(int, int);
        p = func;
        int c = p(a ,b);
        printf("a+b = %d
    ", c);
        return 0;
    }
    
    
  • 相关阅读:
    JS Leetcode 530. 二叉搜索树的最小绝对差 题解分析,再次了解中序遍历
    JS Leetcode 179. 最大数 题解分析,sort a-b与b-a的区别,sort排序原理解析
    Echarts 数据可视化 (二)
    Echarts 数据可视化 (一)
    Less 入门
    【Mybatis-Plus框架学习】专栏总集篇
    【Mybatis-Plus框架学习】雪花算法 剖析
    【多文件自平衡云传输】使用展示 —— 文件传输系统
    详解 资源发现技术 的基本实现
    【多文件自平衡云传输】专栏总集篇
  • 原文地址:https://www.cnblogs.com/dhu121/p/12133991.html
Copyright © 2011-2022 走看看