函数指针怎么调用
展开全部
函数指针的使用过程包含三个步骤:
1、定义一个函数指针;
2、将函数指针指向一个函数;
3、调用这个函数指针所指向的函数。
下面给一个例子加以说明:
int add(int one, int another)
{
return one + another;
}
int sub(int one, int another)
{
return one - another;
}
int rev(int n)
{
return -n;
}
// 先定义3个函数,分别完成加法、减法和求相反数。这样只是为了说明问题的方便。
void main(void)
{
int result;
int (*p)(); // 这样定义指向函数的指针
// 应说明如下问题:
// 1、这里的()绝对不能少;
// 2、前面的int类型应该和这个指针未来要指向的函数的返回值类型保证一致。
p = add;
// 这个操作是最需要说明的。
//1、add是函数名称;
//2、函数名称本质上是一个函数的入口地址常量,或者换句话说,函数名称是指向函数的指针常量(函数名称实质上是这个函数的代码和数据在内存中的首地址);
//3、将函数名称赋值给一个函数指针,就实现了将一个函数指针指向这个函数的作用。实际上,这时的指针变量里存储的就是那个函数的第一条指令的地址。
result = p(3, 4); // 也可以写成:result = (*p)(3, 4);
// 这里依然有几个问题需要说明:
// 有初学者对这里很不理解,认为p是指针名称,不是函数名称,怎么能调用add()函数呢?实际上,问题是这样的:
// “XXXX(...)”这种形式的内容被C语言编译系统这样理解:
// 要调用一个函数,而且这个函数的首地址由XXXX确定;对应的汇编指令主要是:CALL XXXX
// 由于p的值就是函数首地址(函数第一条指令的地址),因此,p()就是在调用地址值为p的值的函数。
p = sub; // 让p指向sub()函数
result = p(6, 2); // 调用sub()函数
p = rev; // 让p指向rev()函数
result = p(5); // 调用rev()函数
}
1、定义一个函数指针;
2、将函数指针指向一个函数;
3、调用这个函数指针所指向的函数。
下面给一个例子加以说明:
int add(int one, int another)
{
return one + another;
}
int sub(int one, int another)
{
return one - another;
}
int rev(int n)
{
return -n;
}
// 先定义3个函数,分别完成加法、减法和求相反数。这样只是为了说明问题的方便。
void main(void)
{
int result;
int (*p)(); // 这样定义指向函数的指针
// 应说明如下问题:
// 1、这里的()绝对不能少;
// 2、前面的int类型应该和这个指针未来要指向的函数的返回值类型保证一致。
p = add;
// 这个操作是最需要说明的。
//1、add是函数名称;
//2、函数名称本质上是一个函数的入口地址常量,或者换句话说,函数名称是指向函数的指针常量(函数名称实质上是这个函数的代码和数据在内存中的首地址);
//3、将函数名称赋值给一个函数指针,就实现了将一个函数指针指向这个函数的作用。实际上,这时的指针变量里存储的就是那个函数的第一条指令的地址。
result = p(3, 4); // 也可以写成:result = (*p)(3, 4);
// 这里依然有几个问题需要说明:
// 有初学者对这里很不理解,认为p是指针名称,不是函数名称,怎么能调用add()函数呢?实际上,问题是这样的:
// “XXXX(...)”这种形式的内容被C语言编译系统这样理解:
// 要调用一个函数,而且这个函数的首地址由XXXX确定;对应的汇编指令主要是:CALL XXXX
// 由于p的值就是函数首地址(函数第一条指令的地址),因此,p()就是在调用地址值为p的值的函数。
p = sub; // 让p指向sub()函数
result = p(6, 2); // 调用sub()函数
p = rev; // 让p指向rev()函数
result = p(5); // 调用rev()函数
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一般需要定义一个函数指针类型
typedef int (*function_pointer_t) ( int arg1, int arg2 );
然后,定义函数指针变量
function_pointer_t fp_invoker = 0;
函数指针可以动态改变内容,改变调用对象,假设有两个函数
int function_sum( int arg1, int arg2 )
{
return arg1+arg2;
}
int function_sub( int arg1, int arg2 )
{
return arg1-arg2;
}
注意到两个函数的原型与函数指针类型是一致的。以下是调用
fp_invoker = function_sum; // 直接用函数名赋值即可
fp_invoker(1,2); // 调用时,可以认为函数指针便是函数名,此时调用加法
fp_invoker = function_sub; // 同理,切换到减法
fp_invoker(1,2); // 调用减法
以上都是直观的用法,通常函数指针用于回调,即下层函数先将函数指针内容保存起来,处理结束后,再调用。此时要注意首先检查函数指针内容是否为空。
if( fp_invoker ){
fp_invoker( arg1, arg2 );
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
函数指针是通过函数名及有关参数进行调用的。
与其他指针变量相类似,如果指针变量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 "stdio.h"
main()
{
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=str2
if(*str2==NULL) exit(-1);
do
{
*str2=*str1;
str1++;
str2++;
}while(*str1!=NULL);
return(p);
}
通过分析可得:
函数指针是一个指向函数的指针,而指针函数只是说明他是一个返回值为指针的函数,
函数指针可以用来指向一个函数。
与其他指针变量相类似,如果指针变量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 "stdio.h"
main()
{
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=str2
if(*str2==NULL) exit(-1);
do
{
*str2=*str1;
str1++;
str2++;
}while(*str1!=NULL);
return(p);
}
通过分析可得:
函数指针是一个指向函数的指针,而指针函数只是说明他是一个返回值为指针的函数,
函数指针可以用来指向一个函数。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询