##函数指针数组数组
语文要学好. 这三个词咱们扩充一下函数
数组 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个字节大小了.code
###指针的数组 int *p[2]; 难度加大了一点,可是咱们冷静一下,仍是能够理解的.这仍是一个数组,仍是两个格子,每一个格子里存的是指向int类型的指针.每一个指针的大小也约定是4个字节.那么sizeof(p);也就是8个字节了. 格子p1,格子p2 这两个格子分别指向int类型的数字. p1->&a;p2->&b;
指针->这个符号是指针专用的.只有指针才能使用->.io
###函数的指针的数组 按照道理里将应该写成 int (*func)(int a)[2];
,可是应该写成int (*fp)[N](int, int);
开始变得有意思了.咱们读一下这个东西.首先看哪里呢?咱们先不看哪里,咱们先来把这一大串东西分解一下. int (*func)[2] (int a);好了,这么一看就明白了. 先读标识符,和他相邻的是指针符号,那么func是一个指针,而后往右,是个数组,那么func应该指向一个数组.那这个数组里存的是什么样的东西呢? 存的是 参数是一个int,返回值是一个int类型的函数.意思是这两个格子里存的是两个函数的地址.function
###解释函数指针 我尝试说明一下这个类型是什么,为何有这样的类型.模板
参数是一个int,返回值是一个int类型的函数
的类型class
看到类型这两个字,你是怎么理解的? 在我看来,类型就是模型,就是模板,是一个蓝图,一个模具. 模具备什么特色?咱们有一个米老鼠的模具,使用橡皮泥塞进去,就能倒出来一个米老鼠了. 若是别人拿了一个不同的米老鼠过来,你使用这个模具是不能卡进去的.可是使用这个模具倒出来的米老鼠是正好能够卡进去的.变量
函数的类型就是描述这个函数长什么样子.描述的要素有:返回值类型 参数个数及其类型. 只要这三个方面一一匹配,咱们就函数是同一个类型的. 好比 int (*func)(int a, int b); 这就是一个函数模板,咱们能够把这样的函数叫作米老鼠模板.di
若是不给这个模板起名字,咱们就说形如这样的函数就叫作 返回值是一个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\n", a+b); milaoshu p; //若是不给这个类型起名叫米老鼠,那么在声明变量p的时候应该这样声明 int (*p)(int, int); p = func; int c = p(a ,b); printf("a+b = %d\n", c); return 0; }