高级函数指针

版权声明:转载请声明 https://blog.csdn.net/qq_40732350/article/details/83094361

指针型函数:

函数类型   *函数名(形参定义表)

int   *fun(int x, int y)

函数指针:

函数类型  (*函数指针名)(形参表)

int   (*fun) (int x, int y)

函数指针数组:

函数类型  (*函数指针名[数组元素个数])(形参表)

int   (*fun [10]) (int x, int y)

上面是定义了一个指针数组,数组元素为函数指针

开始进阶

问1:

声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int*

第一步:定义返回值是int,参数是int*的函数指针pf为int (*pf) (int *)

第二步:含有10个元素的数组的指针p为int (*p)[10]

最后:合成为

int (*(*p)[10]) (int *)

问2:

定义一个函数指针,指向的函数有两个int形参并返回一个函数指针,返回的指针指向一个int形参且返回int的函数

第一步:定义指向的函数有两个int形参并且返回为Type类型的函数指针,为Type (*pf) (int, int)

第二步:返回值为int *,参数为int的函数,为int *f(int)

最后:合成为

int (*(*F)(int, int)) (int)

问3:

定义一个函数指针,指向的函数的返回值为一个函数指针数组(数组元素为返回值为int,参数为int *的函数指针),参数为int *

第一步:指针函数,为int (*f)(int)

第二步:指针数组,为in (*p)[10]

第三步:返回值的数组元素,为int (*s)(int)

最后合成:

int (*(*p)(int *)) [10] (int *)

问4:

下面的定义是啥意思

void (*func(void (*p)(void *), void *x)) (void *);

相信读者应该了解了我就不解释了

函数指针的一般用法是:

void (* fun)(void);  //定义函数指针
fun = (void (*)(void)) 0x12345678  //将地址强制转换为函数类型地址
(*fun)();   //运行地址上的函数

其实函数指针的应用范围还是挺少的

应用代码:

#include <stdio.h>

void fun1(void *x)
{
	printf("%d \n", *((int *)x));
}

void fun2(void *y)
{
	printf("%g \n", *((double *)y));
}

void (*func(void (*p)(void *), void *x)) (void *)
{
	(*p)(x);        //执行P指向的函数,输出2
	return fun2;   //返回fun2函数地址
}

int main()
{
	int x = 2;
	double y = 1.25;
	void *px = &x;
	void *py = &y;
	void (*pf) (void *);
	pf = func(fun1, px);
	(*pf)(py);   //执行fun2  ,输出1.25
	return 0;
}

运行结果:

2

1.25

猜你喜欢

转载自blog.csdn.net/qq_40732350/article/details/83094361
今日推荐