前言

首先,了解两个不同的概念。

  1. 函数指针
    这是个指针。它指向函数的地址。
  2. 指针函数
    这是个函数。它用来返回指针。

声明函数指针

指针有它所对应的类型,比如int*,int类型的指针。所以函数指针也有其类型。
我们又知道,要将一个地址赋给一个指针,它们对应的类型要相同。

  • 首先,函数的声明有两要素。(1)函数的返回值 (2)函数接收的参数的类型

  • 如果有一个函数指针和一个函数,它们各自的两要素一样,这就可以让这个函数的地址赋给这个函数指针。

  • 例如**声明函数指针时只需把(*pf)这个指针和ToUpper这个函数名换掉

函数声明:void ToUpper(char *);
函数指针的声明:void (*pf)(char *);

**这样一来,(*pf)当作ToUpper

注意

  1. 这里必须要将*pf用()括起来。如果不,就成了指针函数了。
  2. 在以后调用函数也要()括起来

使用

  • 首先,我们要知道函数的地址怎么表示。数组就把数组名作为它的首元素地址。函数代码就把函数名作为函数起始处的地址。

  • 赋函数地址给指针
    pf = ToUpper

  • 怎么通过函数指针调用函数
    pf指针存有函数的地址,(*pf)()这个就是相当与ToUpper()。另外,还有pf()这种调用函数的方法也被认同。

一般用法

  • 将函数指针作为函数的参数传递给函数。
    void show(void (* fp)(char *), char * str);//接受函数指针
俩要素要相同,char*才是返回值噢
1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
char* fun(char *, char);//指针函数,返回指针

int main()
{
char* (*pp)(char *, char);//这是一个函数指针,别忘了,char*才是返回值噢
pp = fun;//它指向(指针函数)
}
char *fun(char *p, char ch)
{
return p;
}
函数指针数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
double f1(double, double);
double f2(double, double);
double f3(double, double);
double f4(double, double);

int main()
{
double x = 10.0, y = 2.5;
double (*pf[4])(double, double) = {f1, f2, f3, f4};//声明一个函数指针数组

(*pf[1])(x, y);/这里的*pf[1]一定要加(),才能表示为函数/
}

double f1(double x, double y){}
double f2(double x, double y)
{
printf("ok");
}
double f3(double x, double y){}
double f4(double x, double y){}