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-

Advertisements

你可能會喜歡