0%

C语言 函数指针

C语言 函数指针

指针不仅仅能指向变量,也可以指向函数,这个功能主要用在方便快捷地调用函数上。

比如我们结合前面说的三元描述符、子函数来看看如何用函数指针。

看一个例子如下,我们已经写好了如何选择最大值,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*beginner/pointer/pointer2.c*/
#include <stdio.h>

int max(a, b)
{
return (a > b ? a : b);
}

int main()
{
int a = 6;
int b = 8;
printf("max is %d\n", max(a, b));

return 0;
}

上面的是比较2个值的大小,如果想比较3个值呢,用上面的代码,新增如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*beginner/pointer/pointer3.c*/
#include <stdio.h>

int max(a, b)
{
return (a > b ? a : b);
}

int main()
{
int a = 6;
int b = 8;
int c = 12;

int t = max(a,b);

printf("max is %d\n", max(t, c));

return 0;
}

在增加一个,4个值呢,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*beginner/pointer/pointer4.c*/
#include <stdio.h>

int max(a, b)
{
return (a > b ? a : b);
}

int main()
{
int a = 6;
int b = 8;
int c = 12;
int d = 9;

int t = max(a,b);
int tt = max(t,c);

printf("max is %d\n", max(tt, d));

return 0;
}

所以看出来,每次新增一个值,就需要多调用一次max函数。

如果使用函数指针就可以很好地解决这个问题,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*beginner/pointer/pointer5.c*/
#include <stdio.h>

int max(a, b)
{
return (a > b ? a : b);
}

int main()
{
int (*p)(int, int) = & max;

int a = 6;
int b = 8;
int c = 12;
int d = 9;

int t = p(a,b);
int tt = p(t,c);

printf("max is %d\n", p(tt, d));

return 0;
}

从这里例子也可以看出来,函数的指针的格式如下所示:

  • 返回值与原函数一致;
  • 定义的参数与原函数类型一致;

不过好像也没有简便很多,不过如果碰到函数名巨长无比的,还是有些作用的,另外我们可以使用内嵌的方法,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*beginner/pointer/pointer6.c*/
#include <stdio.h>

int max(a, b)
{
return (a > b ? a : b);
}

int main()
{
int (*p)(int, int) = &max;

int a = 6;
int b = 8;
int c = 12;
int d = 9;

printf("max is %d\n", p(p(p(a, b), c), d));

return 0;
}
处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道