DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

函数指针

1.     定义

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

注意:函数指针的本质是一个指针变量,且指针指向的函数的入口地址

2.     语法

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

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

3.     说明

  • 函数指针定义形式中的数据类型是指函数的返回值的类型。
  • 区分下面两个语句:
int (*p)(int a, int b);  //p是一个指向函数的指针变量,函数返回类型为整型
int *p(int a, int b);     //p是函数名,函数返回类型为整型指针
  • 函数指针指向的变量不是固定的某一个函数的,只是定义了一个变量专门用来存放函数的入口地址的;在程序中把哪一个函数的地址赋给它,它就指向哪一个函数。
  • 在给函数指针变量赋值时,只需给出函数名,而不必给出参数。
int max(int x, int y) { return x+y; }
 
void main()
{
//定义一个函数指针
int (*p)(int a, int b);
p = max; //正确
p = &max; //正确
 
 
//通过函数指针定义变量
p(1,2); //正确
(*p)(1,2); //同样正确
}
 
  • 在一个程序中,指针变量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; //产生编译错误
 
  • 函数指针只能指向函数的入口处,而不可能指向函数中间的某一条指令。不能用*(p+1)来表示函数的下一条指令。
  • 函数指针变量常用的用途之一是把指针作为参数传递到其他函数。

4.     举例

源代码:

#include <iostream>
#include <conio.h>
using namespace std;
 
 
int max(int x, int y); //求最大数
int min(int x, int y); //求最小数
int add(int x, int y); //求和
void process(int i, int j, int (*p)(int a, int b)); //应用函数指针
 
int main()
{
int x, y;
cin>>x>>y;
cout<<"Max is: ";
process(x, y, max);
 
 
cout<<"Min is: ";
process(x, y, min);
 
cout<<"Add is: ";
process(x, y, add);
getch();
return 0;
}
 
 
int max(int x, int y)
{
return x > y ? x : y;
}
 
 
int min(int x, int y)
{
return x > y ? y : x;
}
 
 
int add(int x, int y)
{
return x + y;
}
 
 
void process(int i, int j, int (*p)(int a, int b))
{
cout<<p(i, j)<<endl;
}

函数指针类型

通过typedef定义函数指针类型

int max(int x, int y)
{
return x > y ? x : y;
}
 
//定义函数指针类型
typedef int(*pFun)(int, int)
 
int main()
{
//通过函数指针类型定义函数指针
pFun fun = &max;
fun(1,2);
return 0;
}
posted on 2022-11-09 18:16  DoubleLi  阅读(232)  评论(0编辑  收藏  举报