C语言函数指针定义

C语言函数指针定义,第1张

在最上面加一句这样的定义

typedef void(pFn)();

pFn可以这样理解:首先pFn是一个指针,指针指向一个函数(或者说pFn是一个函数指针),此函数返回一个无类型的指针。最终定义的变量及函数都是指针罢了,不过是指针的类型不同。所以在编译时会有警告,说指针类型不匹配。但对于程序来讲,都是可以在特定的上下文中使用的。

运行结果是

t1,t2交替出现。

其实void也可以换为其它的类型如int, double等

又想到一个很好的办法:

这次编译不会有警告,运行也不会出错。

示例代码如下所示

#include <stdioh>

long t1();

long t2();

int main()

{

long(fn)()= (long ()()) t1 ;

while(1){

fn = (long ()()) fn();

}

}

long t1()

{

printf("t1\n");

return (long)t2 ;

}

long t2()

{

printf("t2\n");

return (long)t1 ;

}

函数指针实质是一个指针,该指针指向函数的入口地址,回调函数只不过是通过参数自己调用自己,首先它是一个函数,跟函数指针完全没有什么可比性,风马牛不相及。

定义一个函数指针你看下:void (func)(int ,int);

再给你看看比如:int p; int max(int x,int y);

p=max;这里呢就是一个指针指针一个函数,所以这个p也是一个函数指针,说白了它就只是一个指针,只是不过指向的是一个函数而已,就这么简单。

就这样调用就可以了int result=(p)(a,b)

你们不要总是把函数指针和指针函数比来比去的,也没有什么可比性,函数指针就只是一个指针,指针函数就只是一个函数就完了!

  1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针

  类型标识符 函数名(参数表)

  int f(x,y);

  

  首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。

  表示:

  float fun();

  float p;

  p = fun(a);

  注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。

  2、函数指针是指向函数的指针变量,即本质是一个指针变量。

  int (f) (int x); / 声明一个函数指针 /

  f=func; / 将func函数的首地址赋给指针f /

  

  指向函数的指针包含了函数的地址,可以通过它来调用函数。声明格式如下:

  类型说明符 (函数名)(参数)

  其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明笔削和它指向函数的声明保持一致。

  指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。

C++指向函数的指针定义方式为:

  返回类型

(指针名)(函数参数列表),例如

void

(p)(int)是指向一个返回值为void

参数为int类型的函数。

  而若想定义一个指向类成员函数的函数指针该怎么定义呢?对成员函数指针的使用。

  (1)非静态成员函数

  定义方式:返回类型

(类名::指针名)(函数参数列表)例如void

(A::p)(int)是一个指向A类中成员函数的函数指针。

  赋值方式:p=&A::函数名,而一般的函数指针的赋值是p=函数名即可,注意区别。(成员函数必须是public类型的)

  调用方式:成员函数指针的调用必须通过类对象进行调用,ap(int)即可调用成员函数(该成员函数是public类型的)

  (2)静态成员函数

  对于静态成员函数的定义和使用方法都与普通函数指针的相同,只是在赋值的时候和非静态成员们函数指针的赋值方法相同。

  因为静态成员函数的指针类型是与普通函数指针类型相同的。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/12183221.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存