函数指针和函数指针类型

参考:https://blog.csdn.net/candyliuxj/article/details/6339414

函数指针

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 
#include 
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<

函数指针类型

通过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;
}
 

 

你可能感兴趣的:(C++,函数指针,函数指针变量)