函数指针是啥?

(本文节选自CSDN论坛报告,仅供学习,如有侵权,请联系删除)

我们知道普通变量在定义的时候,编译器就会自动分配一块适合的内存。函数也是同样的,编译的时候会将一个函数编译好,然后放在一块内存中。

(上面这段说法实际很不准确,因为编译器不会分配内存,编译好的代码也是以二进制的形式放在磁盘上,只有程序开始运行时才会加载到内存)

如果我们把函数的首地址也存储在某个指针变量里,就可以通过这个指针变量来调用所指向的函数了,这个存储函数首地址的特殊指针就叫做函数指针

比如有一个函数 int func(int a);

我们如何声明一个可以指向 func 的函数指针呢?

int (*func_p)(int);

看起来有点奇怪,其实函数指针变量的声明格式和同函数 func 的声明一样,只不过把 func 换成(*func_p)罢了。

为什么要括号呢?因为不要括号的话 int *func_p(int); 就是声明一个返回指针的函数了,括号就是为了避免这种歧义

我们来多看几个函数指针的声明吧:

int (*f1)(int); // 传入int,返回int 
void (*f2)(char*); //传入char指针,没有返回值 
double* (*f3)(int, int); //传递两个整数,返回 double指针

来看一个函数指针的具体用处吧:

# include <stdio.h>

typedef void (*work)() Work; // typedef 定义一种函数指针类型

void xiaobei_work() {
 printf("小北工作就是写代码");
}

void shuaibei_work() {
 printf("帅北工作就是摸鱼")
}

void do_work(Work worker) {
  worker();
}
int main(void)
{
  Work x_work = xiaobei_work;
  Work s_work = shuaibei_work;
  do_work(x_work);
  do_work(s_work);
  return 0;
}

输出:

小北工作就是写代码

帅北工作就是摸鱼

其实这里有点为了用函数指针而用了,不过大家应该体会到了,函数指针最大的优点就是将函数变量化了。

我们可以将函数作为参数传递给其它函数,于是就有了多态的雏形。我们可以传递不同的函数来实现不同的行为。


void qsort(void* base, size_t num, size_t width, int(*compare)(const void*,const void*))

这是 C 标准库中 qsort 函数的申明,它最后一个参数就要求传入一个函数指针,这个函数指针负责比较两个 element。

因为两个元素的比较方式只有调用者才知道,所以这里需要以函数指针的形式告诉 qsort 如何去判定两个元素的大小。

 

好了,函数指针就简单介绍到这里。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值