函数指针是指向函数的指针变量
  因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上一致的。函数指针有两个用途:调用函数和做函数的参数。函数指针的说明方法为: 
  数据类型标志符 (指针变量名)(形参列表);
  注1:“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例
  int func(int x); /* 声明一个函数 */
  int (*f) (int x); /* 声明一个函数指针 */
  f=func; /* 将func函数的首地址赋给指针f */
  赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
  注2:函数括号中的形参可有可无,视情况而定。 
  下面的程序说明了函数指针调用函数的方法: 
  例一、

  #include<stdio.h>  int max(int x,int y){ return(x>y?x:y); }  void 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);  }

  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()  {  void (*funcp)();  funcp=FileFunc;  (*funcp)();  funcp=EditFunc;  (*funcp)();  }

  指针函数和函数指针的区别
  1,这两个概念都是简称,指针函数是指带指针的函数,即本质是一个函数。我们知道函数都又有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。
  其定义格式如下所示: 
  返回类型标识符 *返回名称(形式参数表) 
  { 函数体 } 
  返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。例如下面一个返回指针函数的例子: 
 

 #include<iostream>  using namespace std;  void main()  {   float *find(float(*pionter)[4],int n);  static float score[][4]={{60,70,80,90},{56,89,34,45},{34,23,56,45}};   float *p;   int i,m;   cout<<"Enter the number to be found:";   cin>>m;   p=find(score,m);   for(i=0;i<4;i++)   cout<<""<<*(p+i);   }   float *find(float(*pionter)[4],int n)/*定义指针函数*/   {   float *pt;   pt=*(pionter+n);   return(pt);   } 

  学生学号从0号算起,函数find()被定义为指针函数,起形参pointer是指针指向包含4个元素的一维数组的指针变量。pointer+1指向 score的第一行。*(pointer+1)指向第一行的第0个元素。pt是一个指针变量,它指向浮点型变量。main()函数中调用find()函数,将score数组的首地址传给pointer. 
  2,“函数指针”是指向函数的指针变量,因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上一致的。函数指针有两个用途:调用函数和做函数的参数。
  函数指针的说明方法为: 
  数据类型标志符 (*指针变量名)(参数);
  注1:函数括号中的参数可有可无,视情况而定。下面的程序说明了函数指针调用函数的方法:

  #include   int max(int x,int y){ return(x>y?x:y); }   void main()   {   int (*ptr)();   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);   } 

  ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你像怎么做了。在程序中把 哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数,不过注意,指向函数的指针变量没有++和--运算,用时要小心。
  关于函数指针数组的定义
  关于函数指针数组的定义方法,有两种:一种是标准的方法;一种是蒙骗法。
  第一种,标准方法:
  { 
  分析:函数指针数组是一个其元素是函数指针的数组。那么也就是说,此数据结构是是一个数组,且其元素是一个指向函数入口地址的指针。 
  根据分析:首先说明是一个数组:数组名[] 
  其次,要说明其元素的数据类型指针:*数组名[]. 
  再次,要明确这每一个数组元素是指向函数入口地址的指针:函数返回值类型 (*数组名[])().请注意,这里为什么要把“*数组名[]”用括号扩起来呢?因为圆括号和数组说明符的优先级是等同的,如果不用圆括号把指针数组说明表达式扩起来,根据圆括号和方括号的结合方向,那么 *数组名[]() 说明的是什么呢?是元素返回值类型为指针的函数数组。有这样的函数数祖吗?不知道。所以必须括起来,以保证数组的每一个元素是指针。
  }
  第二种,蒙骗法:
  尽管函数不是变量,但它在内存中仍有其物理地址,该地址能够赋给指针变量。获取函数方法是:用不带有括号和参数的函数名得到。
  函数名相当于一个指向其函数入口指针常量。 那么既然函数名是一个指针常量,那么就可以对其进行一些相应的处理,如强制类型转换。 
  那么我们就可以把这个地址放在一个整形指针数组中,然后作为函数指针调用即可。
  完整例子:
 

 #include "stdio.h"  int add1(int a1,int b1);  int add2(int a2,int b2);  void main()  {  int numa1=1,numb1=2;  int numa2=2,numb2=3;  int (*op[2])(int a,int b);  op[0]=add1;  op[1]=add2;  printf("%d %d\n",op[0](numa1,numb1),op[1](numa2,numb2));  }  int add1(int a1,int b1)  {  return a1+b1;  }  int add2(int a2,int b2)  {  return a2+b2;  }

  再给出常用的C变量的定义方式:
  a) 一个整型数(An integer) 
  b) 一个指向整型数的指针(A pointer to an integer) 
  c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer) 
  d) 一个有10个整型数的数组(An array of 10 integers) 
  e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers) 
  f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers) 
  g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer) 
  h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer )
  答案是:

  a) int a; // An integer   b) int *a; // A pointer to an integer   c) int **a; // A pointer to a pointer to an integer   d) int a[10]; // An array of 10 integers   e) int *a[10]; // An array of 10 pointers to integers   f) int (*a)[10]; // A pointer to an array of 10 integers   g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer   h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an intege

转载于:https://www.cnblogs.com/lyp3314/archive/2011/11/28/2265716.html

关于C的函数指针总结相关推荐

  1. c/c++中的函数指针和指针函数

    定义 1.指针函数,本质是函数,返回值为指针,形如,int *pfun(int, int),由于"*"的优先级低于"()"的优先级,所以等同于int *(pfu ...

  2. 函数指针amp;绑定: boost::functoin/std::function/bind

    see link: https://isocpp.org/wiki/faq/pointers-to-members function vs template: http://stackoverflow ...

  3. 0709 C语言常见误区----------函数指针问题

    1.函数指针的定义 对于函数 void test(int a, int b){ // } 其函数指针类型是void (* ) (int , int), 注意这里第一个括号不能少, 定义一个函数指针,v ...

  4. java跨函数跳转_C语言中将绝对地址转换为函数指针以及跳转到内存指定位置处执行的技巧...

    1.方法一 要对绝对地址0x100000赋值,我们可以用 (unsigned int  * ) 0x100000 = 1234; 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做? ...

  5. 函数指针(就做个笔记)

    1,函数的地址 #include <stdio.h> int main(){int i=0;printf("main=%p\n",main);printf(" ...

  6. 函数指针--Nginx和Redis中两种回调函数写法

    1.Nginx和Redis中两种回调函数写法 #include <stdio.h>//仿Nginx风格 //结构外声明函数指针类型 typedef void (*ngx_connectio ...

  7. 结构体中定义函数指针

    结构体指针变量的定义,定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;- }; struct 结构体标识符 *指针变量名; 变量初始化 ...

  8. C++中函数指针的使用

    A function pointer is a variable that stores the address of a function that can later be called thro ...

  9. C++函数指针解引用

    声明函数的引用: int f( double ); int (* const pf)(double) = f;       // pf是指向函数f()的常量指针 int (&rf)(doubl ...

  10. C++成员变量指针和成员函数指针【The semantics of funcitons】

    原文:https://blog.csdn.net/laojiu_/article/details/68946915 (原文有笔误) 1. #include <cstdio> #includ ...

最新文章

  1. OpenResty搭建高性能服务端
  2. Linux环境编程--fflush(stdout)有什么作用
  3. Android——电脑蓝屏重启后,studio无法认出Android环境 setup JDK(缓存!缓存!缓存)...
  4. java并发实战看不懂,附带学习经验
  5. c++ include 路径_程序员应如何理解include
  6. android第八步查看与输出日志信息
  7. 循环取矩阵的某行_1.2 震惊! 某大二本科生写的矩阵乘法吊打Mathematica-线性代数库BLAS-矩阵 (上)...
  8. 8080端口被其他程序占用,Failed to start connector [Connector[HTTP/1.1-8080]],查看占用程序并关闭
  9. 由B+树看MySQL索引结构
  10. Redis 排行榜 相同分数根据时间优先排行
  11. Linux内核分析 读书笔记 (第四章)
  12. 2019中国软件百强榜:华为、阿里、百度、腾讯位列前四
  13. java获取jsp页面下拉列表框_jQuery+jsp下拉框联动获取本地数据的方法(附源码)
  14. 柳氏管理学:感恩是双向的,强调单方面都是别有用心
  15. 贪吃蛇java游戏代码_java实现贪吃蛇游戏代码(附完整源码)
  16. 腾讯云短信服务(SMS)申请流程
  17. 【巨人的肩膀上制造世界】——5——Unity3D实用插件之Mouse Interaction-Object Highlight,快速构建模型的悬浮高亮!悬浮提示!悬浮动画!
  18. 北京师范大学网络教育计算机动画,北师大网络教育《计算机动画》在线作业.pdf...
  19. vs可以开发python吗_vs可以写python吗
  20. python学习dya4

热门文章

  1. 中小企业如何建立商业智能
  2. apache在线升级yum_基于Redis实现在线游戏积分排行榜 - phyger
  3. vue 查看变量类型_Vue学习 开始走向VUE开发2---插值使用详解
  4. 集合类型及其操作(复习)
  5. python 打开本地程序发生异常_Python中的异常处理
  6. iphone怎么查看wifi密码_WiFi密码忘了怎么办?一秒找回密码
  7. select超过固定条数后出现滚动条_12万公里的路虎维修,两个小小的胶套损坏,导致两条后轮胎偏磨!...
  8. LeetCode 60. 第k个排列(python、c++)
  9. 802. 区间和(离散化)
  10. Python之 if-elif-else