指向函数的指针

原创 2016年09月07日 20:58:34

转载请注明来源: http://blog.csdn.net/kjunchen/article/details/52463163

指向函数的指针

函数指针

如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针

如:

int (*p)(int, int);

定义 p 是一个指向函数的指针变量,它可以指向函数的类型为整型且有两个整型参数的函数。p 的类型用 int(*)(int, int)表示。

用函数指针变量调用函数

调用一个函数,除了可以通过函数名调用外,还可以通过指向函数的指针变量来调用该函数。

通过指针变量访问它所指向的函数

示例:

#include <stdio.h>

int main() {
  int max(int, int);
  int (*p)(int, int);
  int a, b, c;
  p = max;
  printf("Please enter a and b(a,b): ");
  scanf("%d,%d", &a, &b);
  c = (*p)(a, b);
  printf("a = %d, b = %d\nmax = %d\n", a, b, c);
  return 0;
}

int max(int x, int y) {
  int z;
  if(x < y) z = y;
  else z = x;
  return z;
}

运行结果:

Please enter a and b(a,b): 78,65
a = 78, b = 65
max = 78

注意: p 两侧的括号不可省略,表示 p 先与 结合,是指针变量,然后再与后面的 () 结合, () 表示函数,即该指针变量不是指向一般的变量,而是指向函数。

定义和使用指向函数的指针变量

定义指向函数的指针的一般形式为:

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

说明:

  • 由于优先级关系,“ * 指针变量名 ”要用圆括号括起来。

  • 要用指针调用函数,必须先使指针变量指向该函数。

  • 给函数指针变量赋值时,只需给出函数名而不必给出参数。

  • 用函数指针变量调用函数时,只需将 (*p) 代替函数名即可(p 为指针变量名),在 (*p) 之后的括号中根据需要写上实参。如: c = (*p)(a, b);

  • 对指向函数的指针变量不能进行算术运算。

  • 用函数名调用函数,只能调用指定的一个函数,而通过指针变量调用函数比较灵活,可以根据不同情况先后调用不同的函数。

Sample:

#include <stdio.h>

int main() {
  int max(int, int);
  int min(int, int);
  int (*p)(int, int);
  int a, b, c, n;
  printf("please enter a and b(fromat: a,b): ");
  scanf("%d,%d", &a, &b);
  printf("please choose 1 or 2: ");
  scanf("%d", &n);
  if(n == 1) p = max;
  else if(n == 2) p = min;
  c = (*p)(a, b);
  printf("a = %d, b = %d\n", a, b);
  if(n == 1) printf("max = %d\n", c);
  else printf("min = %d\n", c);
  return 0;
}

int max(int x, int y) {
  if(x > y) return x;
  else return y;
}

int min(int x, int y) {
  if(x < y) return x;
  else return y;
}

Run result

please enter a and b(fromat: a,b): 23,65
please choose 1 or 2: 1
a = 23, b = 65
max = 65

please enter a and b(fromat: a,b): 23,65
please choose 1 or 2: 2
a = 23, b = 65
min = 23

用指向函数的指针作函数参数

指向函数的指针变量的一个重要用途是吧函数的地址作为参数传递到其它的的函数。

使用指向函数的指针作为函数的参数,在调用时只需要将函数名作为实参即可。

Sample:

#include <stdio.h>

int main() {
  void fun(int x, int y, int (*p)(int, int));
  int max(int x, int y);
  int min(int x, int y);
  int add(int x, int y);
  int a = 50, b = 24, n;
  printf("Please choose 1, 2 or 3: ");
  scanf("%d", &n);
  if(n == 1) fun(a, b, max);
  else if(n == 2) fun(a, b, min);
  else if(n == 3) fun(a, b, add);
  return 0;
}

void fun(int x, int y, int (*p)(int, int)) {
  int result;
  result = (*p)(x, y);
  printf("%d\n", result);
}

int max(int x, int y) {
  int z;
  if(x > y) z = x;
  else z = y;
  printf("max = ");
  return z;
}
int min(int x, int y) {
  int z;
  if(x < y) z = x;
  else z = y;
  printf("min = ");
  return z;
}

int add(int x, int y) {
  printf("sum = ");
  return x + y;
}

Run result:

Please choose 1, 2 or 3: 1
max = 50

Please choose 1, 2 or 3: 2
min = 24

Please choose 1, 2 or 3: 3
sum = 74

返回指针值的函数

一个函数的返回值可以是整型值、字符值、实型值等,也可以返回指针型的数据,即地址。

定义返回指针值的函数的一般形式为:

类型名 * 函数名 (参数列表)

Sample:

#include <stdio.h>

int main() {
  float *search(float (*pointer)[4], int n); 
  float score[][4] = {{60,70,80,90}, {56,89,67,88}, {34,78,90,66}};
  int i, k;
  float *p; 
  printf("Input the number of student: ");
  scanf("%d", &k);
  printf("The scores of No. %d are: \n", k); 
  p = search(score, k - 1);   
  for(i = 0; i < 4; i ++) {
    printf("%3.2f\t", *(p++));
    //p++;
  }
  printf("\n");
  return 0;
}

float *search(float (*pointer)[4], int n) {
  float *pt;
  pt = *(pointer + n); 
  return pt; 
}

Run result:

Input the number of student: 2
The scores of No. 2 are: 
56.00   89.00   67.00   88.00   

欢迎加QQ群交流: 365532949
Homepage: http://junkchen.com

版权声明:本文为博主原创文章,未经博主允许不得转载。

如何使用指向类的成员函数的指针(详解!)

我们首先复习一下"指向函数的指针"如何使用?   void print()   {   }   void (*pfun)(); //声明一个指向函数的指针,函数的参数是 void,函数的返回值是 vo...
  • lishuhuakai
  • lishuhuakai
  • 2014年01月14日 22:13
  • 26577

C语言中指向函数的指针(我见过的讲的最清晰的文章)

转帖自: http://wenku.baidu.com/view/7e566448cf84b9d528ea7a57.html 1 定义和调用程序在编译后,每个函数都有一个首地址(也就是函数第一...
  • gsnet
  • gsnet
  • 2013年02月26日 16:00
  • 3587

C语言结构体内嵌函数指针

/* .c文件声明:1、关于结构体定义以及初始化的注意事项。 2、关于C语言结构体内嵌函数指针实现面向对象。 对于一个结构体 struct a  { int b; int c; }; //结构体定...
  • MACMACip
  • MACMACip
  • 2017年02月08日 12:57
  • 1589

C语言用指向数组的指针作函数参数小例子

  • 2015年11月20日 17:39
  • 1.64MB
  • 下载

指向函数的指针

  • 2016年05月16日 17:31
  • 1.06MB
  • 下载

指向函数的指针运用

  • 2014年09月02日 15:14
  • 189KB
  • 下载

【C/C++学习】之七、指向函数的指针

什么是指向函数的指针 函数指针是指向函数的指针变量,不是指向对象的指针!函数指针本身应该是“指针变量”; “在C语言中,函数本身不是变量,但可以定义指向函数的指针,这种指针可以被赋值、存放于数...
  • Jofranks
  • Jofranks
  • 2012年08月20日 21:28
  • 4836

C++指向类成员函数的指针

最近在开发中用到了函数指针,于是想整理了一下有关函数指针的概念。O(∩_∩)O~      首先 函数指针是指向一组同类型的函数的指针;而类成员函数我们也可以相似的认为,它是指向同类中同一组类型的成...
  • debugconsole
  • debugconsole
  • 2013年01月17日 10:31
  • 283

2013-7-10学习笔记[字符串操作,指向函数的指针]

字符串方法 strlen(char *str) : 求字符串长度strcpy(char *dest, char *src) : 把src拷贝到deststrcat(char *dest, char *...
  • s10141303
  • s10141303
  • 2013年08月07日 11:43
  • 1032

指向函数的指针1(c语言)

1用函数指针变量调用函数 可以用指针变量指向整形变量、字符串、数组,也可以指向一个函数。一个函数在编译时被分配给一个入口地址。这个入口地址就称为函数的指针。可以用一个指针变量指向函数,然后通过该指针...
  • wwwssshhh2014
  • wwwssshhh2014
  • 2015年10月12日 10:37
  • 206
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:指向函数的指针
举报原因:
原因补充:

(最多只允许输入30个字)