C|函數指針做函數參數或函數返回值
函數指針,是一個指針,一個指向函數基地址的指針,由此指針可以進行函數調用。具體應用可見《C|函數指針和指針函數的聯繫與區別》。
函數指針可以做函數參數也可以做函數返回值。
1 函數指針做為函數參數
//sum.h
extern int getSumFormula(int n);
extern int getSumLoop(int n);
//test.h
#include "sum.h"
extern int testArray(int (*f)(int n));
extern int testEnum(int (*f)(int n));
//sum.c
#include <stdio.h>
#include <stdlib.h>
Advertisements
int getSumFormula(int n)
{
int sum =1;
if(n<1)
return 0;
sum = (1+n)*n/2;
return sum;
}
int getSumLoop(int n)
{
int i,sum =1;
if(n<1)
return 0;
for(i=2;(i<=n)&&(sum>0); i++)
sum+=i;
return sum;
}
#include <stdio.h>
#include <stdlib.h>
#include "test.h"
#define INT_MAX 114096
#define INT_MIN -114096
Advertisements
int testArray(int (*f)(int n))
{
int nArr[] = {INT_MIN, -4,-3,-2,-1,0,1,2,3,4};
int sArr[] = {0, 0,0,0,0,0,1,3,6,10};
int n = sizeof(nArr)/sizeof(int);
int i,sum;
for(i=0;i<n;i++)
{
sum = f(nArr[i]);
if(sum!=sArr[i])
{
printf("錯誤:當計算%d時,兩者不一致(標準值=%d,計算值=%d)。\n",nArr[i],sArr[i],sum);
return 2;
}
}
printf("祝賀:成功通過測試!\n");
return 0;
}
//test.c
int testEnum(int (*f)(int n))
{
int nStart = -3;
int nEnd = INT_MAX;
int i,sum1,sum2;
for(i=nStart;i<=nEnd;i++)
{
sum1 = getSumLoop(i);
if(sum1<0)
{
printf("錯誤:當計算%d時溢出(sum=%d)。\n",i,sum1);
return 1;
}
sum2 = f(i);
if(sum2!=sum1)
{
printf("錯誤:當計算%d時,兩者不一致(標準值=%d,計算值=%d)。\n",i,sum1,sum2);
return 2;
}
}
printf("祝賀:成功通過測試!\n");
return 0;
}
//main.c
#include <stdio.h>
#include <stdlib.h>
#include "test.h"
int main()
{
testArray(getSumLoop);
testEnum(getSumLoop);
testArray(getSumFormula);
testEnum(getSumFormula);
system("pause");
return 0;
}
運行結果
祝賀:成功通過測試!
錯誤:當計算65536時溢出(sum=-2147450880)。
祝賀:成功通過測試!
錯誤:當計算46341時,兩者不一致(標準值=1073767311,計算值=-1073716337)。
2 函數指針做為函數返回值
//main.c
#include <stdio.h>
#include <stdlib.h>
#include "test.h"
int returnf0()
{
return 0;
}
int (*funcp(int m))(int n)
{
if(m<46341)
return getSumFormula;
if(m<65536)
return getSumLoop;
return returnf0;
}
int main()
{
int i;
int (*f)(int n);
int a[] = {-4,4,46340,46341,65535,65536};
int n = sizeof(a)/sizeof(int);
for(i=0;i<n;i++)
{
f = funcp(a[i]);
printf("從1到%d的和等於%d。\n",a[i],f(a[i]));
}
system("pause");
return 0;
}
運行結果
從1到-4的和等於0。
從1到4的和等於10。
從1到46340的和等於1073720970。
從1到46341的和等於1073767311。
從1到65535的和等於2147450880。
從1到65536的和等於0。
-End-