C言语函数指针定义 (c语言的函数指针介绍)
本文目录导航:
C言语函数指针定义
在最上方加一句这样的定义typedef void*(*pFn)();pFn可以这样了解:首先pFn是一个指针,指针指向一个函数(或许说pFn是一个函数指针),此函数前往一个无类型的指针。
最终定义的变量及函数都是指针罢了,不过是指针的类型不同。
所以在编译时会有正告,说指针类型不婚配。
但关于程序来讲,都是可以在特定的高低文中经常使用的。
运转结果是t1,t2交替产生。
其实void也可以换为其它的类型如int, double等 又想到一个很好的方法:这次编译不会有正告,运转也不会出错。
示例代码如下所示#include <stdio.h>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 ;}

求指针函数的经常使用!!
1.函数指针定义函数类型 (*指针变量名)(形参列表);“函数类型”说明函数的前往类型,因为“()”的优先级高于“*”,所以指针变量名外的括号必无法少,前面的“形参列表”示意指针变量指向的函数所带的参数列表。
例如:int (*f)(int x);double (*ptr)(double x);在定义函数指针时请留意:函数指针和它指向的函数的参数个数和类型都应该是—致的;函数指针的类型和函数的前往值类型也必定是分歧的。
2.函数指针的赋值函数名和数组名一样代表了函数代码的首地址,因此在赋值时,间接将函数指针指向函数名就行了。
例如,int func(int x); /* 申明一个函数 */int (*f) (int x);/* 申明一个函数指针 */f=func;/* 将func函数的首地址赋给指针f */赋值时函数func不带括号,也不带参数,因为func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
3.经过函数指针调用函数函数指针是经过函数名及无关参数启动调用的。
与其余指针变量相相似,假设指针变量pi是指向某整型变量i的指针,则*p等于它所指的变量i;假设pf是指向某浮点型变量f的指针,则*pf就等价于它所指的变量f。
雷同地,*f是指向函数func(x)的指针,则*f就代表它所指向的函数func。
所以在口头了f=func;之后,(*f)和func代表同一函数。
因为函数指针指向存储区中的某个函数,因此可以经过函数指针调用相应的函数。
如今咱们就探讨如何用函数指针调用函数,它应口头上方三步:首先,要说明函数指针变量。
例如:int (*f)(int x);其次,要对函数指针变量赋值。
例如: f=func;(func(x)必定先要有定义)最后,要用 (*指针变量)(参数表);调用函数。
例如:(*f)(x);(x必定先赋值)【例】恣意输入n个数,找出其中最大数,并且输入最大数值。
main(){int f();int i,a,b;int (*p)();/* 定义函数指针 */scanf(%d,&a);p=f;/* 给函数指针p赋值,使它指向函数f */for(i=1;i<9;i++){scanf(%d,&b);a=(*p)(a,b);/* 经过指针p调用函数f */}printf(The Max Number is:%d,a)}f(int x,int y){int z;z=(x>y)?x:y;return(z);}运转结果为:343 -45 4389 4235 1 -534 988 555 789↙The Max Number is:4389【指针函数】一个函数不只可以带回一个整型数据的值,字符类型值和实型类型的值,还可以带回指针类型的数据,使其指向某个地址单元。
前往指针的函数,普通定义格局为:类型标识符*函数名(参数表)int *f(x,y);其中x,y是方式参数,f是函数名,调用后前往一个指向整型数据的地址指针。
f(x,y)是函数,其值是指针。
如:char *ch();示意的就是一个前往字符型指针的函数,请看上方的例题:【例】将字符串1(str1)复制到字符串2(str2),并输入字符串2.#include (){char *ch(char *,char *);char str1[]=I am glad to meet you!;char str2[]=Welcom to study C!;printf(%s,ch(str1,str2));}char *ch(char *str1,char *str2){int i;char *p;p=str2if(*str2==NULL) exit(-1);do{ *str2=*str1;str1++;str2++;}while(*str1!=NULL);return(p);}经过分析可得函数指针是一个指向函数的指针,而指针函数只是说明他是一个前往值为指针的函数,函数指针可以用来指向一个函数。
函数指针定义
函数指针:函数指针是指向函数的指针变量。
因此“函数指针”自身首先应是指针变量,只不过该指针变量指向函数。
这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。
如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。
有了指向函数的指针变量后,可用该指针变量调用函数,就似乎用指针变量可援用其余类型变量一样,在这些概念上是大体分歧的。
函数指针有两个用途:调用函数和做函数的参数。
函数指针的申明方法为:前往值类型 ( * 指针变量名) ([形参列表]);注1:“前往值类型”说明函数的前往类型,“(指针变量名 )”中的括号不能省,括号扭转了运算符的优先级。
若省略全体则成为一个函数说明,说明了一个前往的数据类型是指针的函数,前面的“形参列表”示意指针变量指向的函数所带的参数列表。
例如:int func(int x); /* 申明一个函数 */int (*f) (int x); /* 申明一个函数指针 */f=func; /* 将func函数的首地址赋给指针f */或许经常使用上方的方法将函数地址赋给函数指针:f = &func;赋值时函数func不带括号,也不带参数,因为func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
注2:函数括号中的形参可有可无,视状况而定。
上方的程序说明了函数指针调用函数的方法:例一、#include<stdio.h>int max(int x,int y){return (x>y? x:y);}int main(){int (*ptr)(int, int);int a, b, c;ptr = max;scanf(%d%d, &a, &b);c = (*ptr)(a,b);printf(a=%d, b=%d, max=%d, a, b, c);return 0;}ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实践上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数称号那样是死的,它可以指向任何函数,就看你想怎样做了。
在程序中把哪个函数的地址赋给它,它就指向哪个函数。
然后用指针变量调用它,因此可以先后指向不同的函数。
不过留意,指向函数的指针变量没有++和--运算,用时要小心。
不过,在某些编译器中这是不能经过的。
这个例子的补充如下。
应该是这样的:1.定义函数指针类型:typedef int (*fun_ptr)(int,int);2.申明变量,赋值:fun_ptr max_func=max;也就是说,赋给函数指针的函数应该和函数指针所指的函数原型是分歧的。
例二、#include<stdio.h>void FileFunc(){printf(FileFunc\n);}void EditFunc(){printf(EditFunc\n);}void main(){typedef void(*funcp)();funcp pfun=FileFunc;pfun();pfun=EditFunc;pfun();}