指向函数的指针

原创 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

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

相关文章推荐

指向函数的指针

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

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

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

指向函数的指针运用

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

用指向数组的指针作函数参数.etc

今天还是以课本上的例子为主。 有一个班,3个学生各学四门课,计算总平均分及第n个学生的成绩。 先定义一个计算平均值得函数,average。 void average(float *p,int n) {...

指向函数的指针(一)

之所以想写一篇函数指针的文章,源于函数指针在C/C++编程中使用的广泛性,而对于一些初级编程者来说对函数指针的使用或许有些迷惑,而一旦在适当的时候使用了函数指针,会使代码简洁有力。本篇介绍的是函数指针...
  • hzyong_c
  • hzyong_c
  • 2012年04月16日 00:08
  • 11881

C++中返回指向函数的指针学习

int  *p()   定义一个函数,该函数返回一个指向整型元素的指针变量  int  (*p)()  指向函数的指针,该函数返回一个整型值 在C++ primer 238页中出现的int(*...

指向成员函数的指针

取一个非静态成员函数的地址,如果该函数是nonvirtual,则得到的结果是它在内存中真正的地址。然而这个值也不是完全的,它也需要被绑定于某个class object的地址上,才能够通过它调用该函数。...

C++指向类成员函数的指针详细解析

由于这几天在开发中要用到函数指针,所以就整理了一下关于函数指针的概念 首先 函数指针是指向一组同类型的函数的指针;而类成员函数我们也可以相似的认为,它是指向同类中同一组类型的成员函数的指针,...

指向函数的指针

假定我们被要求提供一个如下形式的排序函数 :sort( start, end, compare ); start 和 end是指向字符串数组中元素的指针,函数 sort()对于 start 和end之...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:指向函数的指针
举报原因:
原因补充:

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