💓博主CSDN主页:杭电码农-NEO💓
⏩专栏分类:C语言学习分享⏪
🚚代码仓库:NEO的学习日记🚚
🌹关注我🫵带你学习更多C语言知识
🔝🔝
1. 前言
本篇文章将接着指针详解(上)
继续深入介绍指针的详细细节
本篇的任务以介绍函数指针数组
和介绍指向函数指针数组的指针
为基础,为大家着重讲解库函数
qsort的实现!
2. 函数指针数组
已知数组是一个用来存放相同
类型数据的存储空间,所以函数指针数组
实际上是一份存放类型全是
函数指针的空间
举个例子:
先写四个函数:
int Add(int x, int y) { return x + y; } int Sub(int x, int y) { return x - y; } int Mul(int x, int y) { return x * y; } int Div(int x, int y) { return x / y; }
再使用它们:
int main() { int (*pf1)(int, int) = Add; int (*pf2)(int, int) = Sub; int (*pf3)(int, int) = Mul; int (*pf4)(int, int) = Div; //函数指针数组 int (*pfArr1[4])(int, int) = {Add, Sub, Mul, Div}; int (*pfArr2[4])(int, int) = {pf1, pf2, pf3, pf4};//这两个数组存储的内容是一样的 // return 0; }
这里的pfArr1和pfArr2就是函数指针数组
可以这样理解这段代码:
2.1 函数指针数组的用途
一个非常经典的用途就是计算器!
如果不使用函数指针数组的话
用户想要的加减乘除法
需要switch语句来实现
然而switch语句常常很冗杂
使用函数指针数组可以简化代码量!
比如:
int (* pfArr[5])(int, int) = {NULL, Add, Sub, Mul, Div}; 0 1 2 3 4
定义一个函数指针数组的话
可以直接使用下标访问加减乘除函数
假如这里的计算器功能很多,那么!
使用数组显然比用冗杂的switch语句好
拓展:
函数指针数组的应用场景:
3. 指向函数指针数组的指针
已经开始套娃环节了
刚刚介绍的函数指针数组
它本质上还是一个数组,数组就有地址
而指向函数指针数组的指针就是一个指针
指针指向一个数组
数组的元素都是函数指针
比如:
void test(const char* str) { printf("%s\n", str); } int main() { //函数指针pfun void (*pfun)(const char*) = test; //函数指针的数组pfunArr void (*pfunArr[5])(const char* str); //指向函数指针数组pfunArr的指针ppfunArr void (*(*ppfunArr)[5])(const char*) = &pfunArr; return 0; }
这段代码可以这样理解: