1. 程式人生 > >函式指標和函式指標型別

函式指標和函式指標型別

參考: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 <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;
}