函数指针,指针函数疑惑解析

本文深入探讨了C++中的函数指针概念及其使用方法,包括如何定义和使用函数指针,以及一些复杂的函数指针示例。文章还强调了函数指针只能指向全局函数或类的静态成员函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文的主要参考书籍是  C++ Primer


需要注意:
函数指针所指向的函数,必须为全局函数或类的静态函数。


函数指针是指向函数起始地址的指针,一般可以认为是函数名的变量形式,

如:void f(int i) {printf("%d", i-1);} 

//函数,f是常量void g(int i) {printf("%d", i+1);}

  //函数,g是常量void out(void (*foo)(int)){ //函数指针foo是变量 foo(5); 

 //到底调用哪个函数取决于参数foo被赋值为f还是g}

	void main()
        { 
         out(f); 
         out(g);
	}

输出:46

void (*foo)(int)的解释方法是:foo是一个指针,指针指向一个函数,函数有一个int参数,并且函数无返回值。


int (*fp)(int a);//这里就定义了一个指向函数的指针

  函数指针不能绝对不能指向不同类型,或者是带不同形参的函数,在定义函数指针的时候我们很容易犯如下的错误。

int *fp(int a);//这里是错误的,因为按照结合性和优先级来看就是先和()结合,然后变成了一个返回整形指针的函数了,而不是函数指针,这一点尤其需要注意! 


一个最简单的函数指针定义如下:

Void (*funcPtr) (); //funcptr是一个函数指针,它指向的函数没有参数,返回值为void

非常复杂的函数指针定义:

1.            Void * (* ( * fp1)(int))[10];

解析:Void * X[10];è这是一个有10void*类型的元素的数组。

         X=* ( * fp1)(int),从而可以看出(*fp1(int)它是一个指针,指向一个数组。这个数组有10void指针类型的元素。

       Fp1是一个函数指针,它的参数是一个int型的参数。返回值为一个指向含有10void*元素的数组的指针。

2.            Void * ( * fp1)(int)[10]

解析:void*X[10];èX是一个有着10void*类型的数组

      X=( * fp1)(int);

      Fp1是一个函数指针,它有一个整型参数,其返回值是一个有着10void*类型的元素的数组。

若是这个形式Void * ( * fp1)(int)[10],则其返回值为一个指向含有10void类型的数组的指针。

3.            Void ( * fp1)(int)[10]

解析:void X[10]èX是一个有着10void类型的数组

     X=( * fp1)(int);

        Fp1是一个函数指针,它有一个整型参数,其返回值是一个有着10void类型的元素的数组

若是这个形式,Void ( * fp1)(int)[10],则其返回值为一个有10void类型的数组。

4.            Float (*(*fp2)(int,int,float))(int);

解析:Float X(int)èX是一个函数,有一个整型参数,返回值是一个浮点数。

X=*(*fp2)(int,int,float)

Fp2是一个函数指针,它有三个参数,前两个是整型,最后一个是浮点型。其返回值是一个指针,是一个指向函数的指针(函数指针)。这个函数指针所指向的函数的原型是只有一个整型参数,返回值是一个浮点数。

5.            Typedef double (*(*(*fp3)())[10])();

解析:fp3是一个函数指针;它不带参数;返回值是一个指针。

  X=(*(*fp3)())

Typedef double (*X[10])()

X是一个数组,他有10个元素,它的元素都是函数指针,这个函数指针所指向的函数原型是一个没有参数,返回值为double类型的函数。

综合起来就是:fp3是一个新定义的数据类型,它是一个函数指针,这个函数指针所指向的函数原型是不带参数,返回值是一个指向数组的指针。这个数组有10个元素,其元素类型是一个函数指针,这个函数指针所指向的函数原型是一个没有参数,返回值为double类型的函数。

6.  Int (*(*fp4())[10])();
解析:fp4是一个函数,他没有参数,返回值是一个指针;

      X= (*fp4());

Int (*X[10])();

X是一个数组,其有10个元素,每个元素都是一个函数指针,这个函数指针所代表的函数原型是一个没有参数,返回值是整型的函数。

综合起来就是:fp4是一个函数,他没有参数,返回值时一个指向数据的指针,这个数组有10个元素,每个元素都是一个函数指针,这个函数指针所代表的函数圆型是一个没有参数,返回值是整型的函数。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值