一维数组传参时传的是首元素地址
那二维数组传参时传的也是首元素地址,但二维数组的本质是“一维数组的数组”
所以它传参时传的是二维数组第一行数组的地址,
形参可以写成数组也可以写成指针,写成数组更好理解
一·函数指针变量
函数指针变量
1.&add与add是没有区别的 (都是函数的地址)如图
2.函数指针变量:类比数组指针,int(*p)[n] int(*p)(int,int)=&add;
(变量去掉名字就是它的类型:如 int(*p1)[n]去掉名字就是int(*)[n],这就是p1的类型
同理 int( * p2)(int,int)去掉名字就是int(*)(int,int),这就是p2的类型)
接下来看两个经典例题
如图:
第一个:( * ( void (*) ( ) )0 ) ();
这段代码的作用:调用0地址处的那个函数
( void (*) () )这部分是对0的强制类型转换
内部的 void (*) ()是返回类型为void没有参数的函数指针
第二个:void( * signal( int, void(*)(int) ) ) (int) ;
这段代码:这个函数的返回类型是一个函数指针,该函数指针指向的函数参数是int类型,返回类型是void
内部这部分:signal( int, void(*)(int) )是一个函数,
这个函数有两个参数,一个是int,一个是是返回类型为void没有参数的函数指针
二·typedef
typedef 关键字
typedef 是用来类型重命名的,可以将复杂的类型,简单化。
如图
利用 typedef 还能更好的理解上面的第二段代码
如图
三·函数指针数组
类比其他数组
1."整型数组" int arr[]
2."字符数组" char brr[]//前面的类型就是数组元素的类型
3."指针数组" int(*)[]
那"函数指针数组"前面的类型就要写成函数指针类型
(这里以参数为int型返回类型为int型的函数为例)
所以应该写成 int(*p[n])(int, int)
四·函数指针数组的用途
转移表(简型计算器)
如图
接下来使用函数指针数组来实现。