c 的函数指针是怎样用的呀 (c的函数指针和委托区别)

本文目录导航:

c++的函数指针是怎样用的呀?

函数指针,即指向函数的指针。

c 的函数指针是怎样用的呀 (c的函数指针和委托区别)

1.定义

每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针。

2.语法

指向函数的指针变量的普通定义方式为:

数据类型(*指针变量名)(参数表);

3.说明

1)函数指针的定义方式中的数据类型是指函数的前往值的类型。

2)辨别上方两个语句:

int (*p)(int a, int b); //p是一个指向函数的指针变量,所指函数的前往值类型为整型

int *p(int a, int b); //p是函数名,此函数的前往值类型为整型指针

3)指向函数的指针变量不是固定指向哪一个函数的,而只是示意定义了一个这样类型的变量,它是专门用来寄存函数的入口地址的;在程序中把哪一个函数的地址赋给它,它就指向哪一个函数。

4)在给函数指针变量赋值时,只有给出函数名,而不用给出参数。

如函数max的原型为:int max(int x, int y);指针p的定义为:int (*p)(int a, int b);则p = max;的作用是将函数max的入口地址赋给指针变量p。

这时,p就是指向函数max的指针变量,也就是p和max都指向函数的扫尾。

5)在一个程序中,指针变量p可以先后指向不同的函数,但一个函数不能赋给一个不分歧的函数指针(即不能让一个函数指针指向与其类型不分歧的函数)。

如有如下的函数:int fn1(int x, int y);int fn2(int x);

定义如下的函数指针:int (*p1)(int a, int b);int (*p2)(int a);

则

p1 = fn1; //正确

p2 = fn2; //正确

p1 = fn2; //发生编译失误

6)定义了一个函数指针并让它指向了一个函数后,对函数的调用可以经过函数名调用,也可以经过函数指针调用(即用指向函数的指针变量调用)。

如语句:c = (*p)(a, b); //示意调用由p指向的函数(max),实参为a,b,函数调用完结后获取的函数值赋给c。

7)函数指针只能指向函数的入口处,而无法能指向函数两边的某一条指令。

不能用*(p+1)来示意函数的下一条指令。

8)函数指针变量罕用的用途之一是把指针作为参数传递到其余函数

实例:

便捷明了的C言语笔记——指针函数、函数指针、回调函数

指针函数定义为前往指定类型指针的函数。

其前往值需经过同类型指针变量接受。

定义格局:类型名 *函数名(函数参数列表)。

函数指针实质是存储函数地址的指针。

定义格局:类型名 (*函数名)(函数参数列表)。

函数指针可以用于调用函数,传递参数。

回调函数是将函数指针作为参数的函数。

在回调中,指派的义务详细口头者是回调函数,口头结果反应给调用者。

回调函数简化了规定变动时的降级流程。

例如:指针函数定义、函数指针申明、回调函数运行。

留意辨别指针函数与函数指针,函数指针指向函数而非变量。

函数指针的两个重要用途:调用函数和作为函数参数。

函数指针定义

函数指针:函数指针是指向函数的指针变量。

因此“函数指针”自身首先应是指针变量,只不过该指针变量指向函数。

这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。

如前所述,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();}

你可能想看:
« 上一篇
下一篇 »

相关推荐

FreeBasic:强大免费开源的64位basic编译器及应用优势

2025年05月10日

82阅读

脊柱侧弯矫正方法大盘点:运动康复、支具矫正等多种方式

2025年05月09日

87阅读

如何在winForm标题栏去掉标题文字且任务栏图标正常显示

2025年05月09日

86阅读

十一黄金周促销广告词大全,国庆购物狂欢等你来

2025年05月09日

78阅读

关闭快速编辑模式及插入模式,设置控制台指定文字颜色举例

2025年05月09日

63阅读

黄金搭档低糖高钙饮品包装及成分功效全解析,适合人群要知晓

2025年05月09日

91阅读