1. 程式人生 > >typedef函式指標用法

typedef函式指標用法

#include <stdio.h>
#include <assert.h>

typedef int (*FP_CALC)(int,int);//定義一個函式指標型別

int add(int a, int b)
{
	return a + b;
}

int sub(int a, int b)
{
	return a - b;
}

int mul(int a, int b)
{
	return a * b;
}

int div(int a, int b)
{
	return b ? a/b : -1;
}

//定義一個函式,引數為op,返回一個指標,該指標型別為擁有兩個int引數、
//返回型別為int的函式指標。它的作用是根據操作符返回相應函式的地址
FP_CALC calc_func(char op)
{
	switch( op )
	{
	case '+':
		return add;
	case '-':
		return sub;
	case '*':
		return mul;
	case '/':
		return div;
	default:
		return NULL;
	}
	return NULL;
}

//s_calc_func為函式,它的引數是 op,   
//返回值為一個擁有兩個int引數、返回型別為int的函式指標  
int (*s_calc_func(char op)) (int , int)
{
	return calc_func(op);
}

//終端使用者直接呼叫的函式,該函式接收兩個int整數,
//和一個算術運算子,返回兩數的運算結果
int calc(int a, int b, char op)
{
	FP_CALC fp = calc_func(op);
	int (*s_fp)(int,int) = s_calc_func(op);//用於測試

	assert(fp == s_fp);// 可以斷言這兩個是相等的

	if(fp)
		return fp(a,b);
	else
		return -1;
}

void main()
{
	int a = 100, b = 20;

	printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));
	printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));   
    printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));   
    printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/')); 
}

參考: