如何定义一个指向任何函数的指针 (如何定义一个函数)
本文目录导航:
如何定义一个指向任何函数的指针
(一) 用函数指针变量调用函数可以用指针变量指向整形变量、字符串、数组、结构体、也可以指向一个函数。
一个函数在编译时被调配一个入口地址。
这个入口地址就称为函数指针。
可以用一个指针变量指向函数,然后经过该指针变量调用此函数。
用繁难的数值比拟为例:1 #include <stdio.h> 2 #include <stdlib.h> 3 4int main() 5 { 6 int max(int,int); 7 int (*p)(int,int); 8 int a,b,c; 9 p = max;10 scanf(%d,%d,&a,&b);11 c = (*p)(a,b);12 printf(a=%d,b=%d,max=%d\n,a,b,c);13 return 0;14 }15 16 int max(int x,int y)17 {18 int z;19 if(x>y) z = x;20 else z = y;21 return(z);22 }main函数中的 c = max(a,b); 包含了一次性函数的调用。
每一个函数都占用一段内存单元。
因此,可以用一个指针变量指向一个函数,经过指针变量来访问它指向的函数。
第7行:int (*p)( int,int );用来定义 p 是一个指向函数的指针变量,该函数有两个整形参数,函数值为整形。
留意 *p 两侧的括号无法省略,示意 p 先与 * 联合,是指针变量,然后再与前面的 ( ) 联合,示意此指针变量指向函数,这个函数值 (即函数的前往值) 是整形的。
假设写成 int *p ( int,int ) ,由于( )的优先级高于 *,它就成了申明一个函数P( 这个函数的前往值是指向整形变量的指针)。
赋值语句 p = max ; 作用是将函数 max 的入口地址赋给指针变量p。
和数组名代表数组首元素地址相似,函数名代表该函数的入口地址。
这时 p 就是指向函数 max 的指针变量,此时 p 和 max都指向函数扫尾,调用 *p 就是调用 max 函数。
然而p作为指向函数的指针变量,它只能指向函数入口处而无法能指向函数两边的某一处指令处,因此不能用 *(p + 1)来示意指向下一条指令。
留意:(1) 指向函数的指针变量的普通定义方式为:数据类型 (*指针变量名)(函数参数列表)这里数据类型就是函数前往值的类型(2) int (* p) ( int,int ); 它只是定义一个指向函数的指针变量 p, 它不是固定指向哪一个函数的,而只是示意定义这样一个类型的变量,它是专门用来寄存函数的入口地址的。
在程序中把哪一函数(该函数的值应该是整形的,且有两个整形参数)的地址赋给它,他就指向哪一个函数。
在一个函数中,一个函数指针变量可以先后指向同类型的不同函数。
(3) p = max; 在给函数指针变量赋值时,只有给出函数名而不用给出函数参数,由于是将函数的入口地址赋给 p ,而不触及 实参和形参的联合疑问,不能写成 p = max(a,b);(4) c = (*p)(a,b) 在函数调用时,只有将( *p ) 替代函数名即可,前面实参照旧。
(5) 关于指向函数的指针变量,像 p++ ,p+n.....是有意义的。
(二) 用指向函数的指针作为函数参数函数指针变量理论的用途之一就是把指针作为参数传递到其余函数。
函数的参数可以是变量、指向变量的指针变量、数组名、指向数组的指针变量,也可以是指向函数的指针也可以作为参数,以成功函数地址的传递,这样就能够在被调用的函数中经常使用实参函数。
voidsub ( int ( *x1) (int), int (*x2) (int,int) ){int a,b,i,j;a = (*x1)(i);/* 调用 f1 函数 */b = (*x2)(i)(j);/* 调用 f2 函数 */}假设实参为两个 函数名 f1 和 f2. 在函数首部定义x1、x2为函数指针变量,x1指向的函数有一个整形形参,x2指向的函数有两个形参。
i 和 j 是函数f1 和 f2所要的参数。
函数sub的形参 x1、x2(指针变量)在函数 sub 未被调用时并不占用内存单元,也不指向任何函数。
在sub被调用时,把实参函数 f1 和 f2的入口地址传给方式指针变量 x1 和 x2.既然在 sub 函数中要调用 f1 和 f2 函数,为什么不间接调用f1 和 f2而要用函数指针变量呢? 确实,假设只是用到f1 和 f2 函数,齐全可以在sub函数中间接调用f1 和 f2,而不用设指针变量 x1 和 x2。
然而,假设在每次调用sub时,调用的函数不是固定的,下次是f3 和 f4,再是f5 和 f6...这时用指针变量就比拟繁难了。
c言语中如何把函数赋值给一个变量
在C言语中,可以经常使用函数指针来将函数赋值给一个变量。
函数指针是一个指针变量,它指向函数的地址,可以经过将函数名作为参数传递给指针变量来成功赋值。
例如,假设要将函数add()赋值给变量p,可以经常使用函数指针int (*p)() = add;。
这个语句申明了一个指向函数的指针变量p,它的前往类型为int,参数列表为空,赋值为add函数的地址。
然后就可以经过调用指针变量p来口头add函数。
这种方式可以成功函数的灵活调用和传递,提高了程序的灵敏性和可保养性。
函数指针定义
函数指针:函数指针是指向函数的指针变量。
因此“函数指针”自身首先应是指针变量,只不过该指针变量指向函数。
这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。
如前所述,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();}