我们可以将指向某个函数的指针转换为其他类型的指针,不过要谨慎使用,因为运行时系统不会验证函数指针所用的参数是否正确。也可以把一种函数指针转换为另一种再转换回来,得到的结果和原指针相同,但函数指针的长度不一定相等。下面的代码说明了这个操作:
typedef int (*fptrToSingleInt)(int);
typedef int (*fptrToTwoInts)(int,int);
int add(int, int);
fptrToTwoInts fptrFirst = add;
fptrToSingleInt fptrSecond = (fptrToSingleInt)fptrFirst;
fptrFirst = (fptrToTwoInts)fptrSecond;
printf("%d\n",fptrFirst(5,6));
这段代码执行后输出11。
警告 无法保证函数指针和数据指针相互转换后正常工作。
void*
指针不一定能用在函数指针上,也就是说我们不应该像下面这样把函数指针赋给void*
指针:
void* pv = add;
不过在交换函数指针时,通常会见到如下声明所示的“基本”函数指针类型。这里把fptrBase
声明为指向不接受参数也不返回结果的函数的函数指针。
typedef void (*fptrBase)();
下面的代码片段说明了基本指针的用法,跟上一个例子是一样的效果:
fptrBase basePointer;
fptrFirst = add;
basePointer = (fptrToSingleInt)fptrFirst;
fptrFirst = (fptrToTwoInts)basePointer;
printf("%d\n",fptrFirst(5,6));
基本指针用做占位符,用来交换函数指针的值。
警告 一定要确保给函数指针传递正确的参数,否则会造成不确定的行为。