指向函数的指针

标签: 指针 函数
472人阅读 评论(0) 收藏 举报
分类:

转载请注明来源: 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

查看评论

指向函数的指针的使用

谈到这个话题,初学者可能在这方面较难看懂。不过对c/c++较熟悉的人来说,大家谈到指向函数的指针就会想到在排序中,那个以函数作为参数传递到排序函数中就是一个最典型的应用。1.指向函数的指针的类型指向函...
  • dremi
  • dremi
  • 2007-10-18 01:01:00
  • 8657

指向函数的指针(一)

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

指向函数的指针 - C语言

基本概念 在C语言中,函数本身不是变量,但可以定义指向函数的指针。这种类型的指针可以被赋值、存放在数组中、传递给函数以及作为函数的返回值等等。 函数作为参数传递给函数时,因为它们是函数,前面不需要加取...
  • milkcu
  • milkcu
  • 2013-05-19 23:10:23
  • 2232

C/C++——指向函数的指针和指向函数的指针的数组

指向函数的指针 指向函数的指针的数组
  • Linux_ever
  • Linux_ever
  • 2016-03-15 22:06:03
  • 1347

用指向函数的指针作函数参数2(c语言)

函数的参数可以是变量、指向变量的指针变量、数组名、指向数组的指针变量等。还有一种就是指向函数的指针也可以作为参数,以便实现函数地址的传递,也就是将函数名传递给形参。 它的原理:有一个函数(假设函数名为...
  • wwwssshhh2014
  • wwwssshhh2014
  • 2015-10-13 10:30:19
  • 462

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

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

C++基础重温之一:指向函数的指针

 1. 指向函数的指针的类型下面是函数lexicoCompare()的定义它按字典序比较两个字符串#include int lexicoCompare( const string &s1, const...
  • anjy
  • anjy
  • 2007-05-16 00:02:00
  • 1051

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

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

返回指向函数的指针的函数 的一个例子

在C++ PRIMER讲返回指向函数的指针的函数时,总是有点稀里糊涂的,想有一个明确的例子来理解,可惜书上没写。 于是,琢磨了一会儿,自己用了一个简单的例子 想来大家也都看得懂,我就不在代码中写注...
  • heliang6291
  • heliang6291
  • 2013-03-02 22:50:46
  • 551

指向函数的指针作为参数时的使用方法

谭教授说,指向函数的指针作为参数是C语言实际应用中的一个比较深入的部分,那就等以后用到了,做个参考吧。#include void min(int a,int b); void max(int a,...
  • nyist327
  • nyist327
  • 2014-03-27 21:25:49
  • 1665
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 18万+
    积分: 2176
    排名: 2万+
    博客专栏