C转换函数指针

我们可以将指向某个函数的指针转换为其他类型的指针,不过要谨慎使用,因为运行时系统不会验证函数指针所用的参数是否正确。也可以把一种函数指针转换为另一种再转换回来,得到的结果和原指针相同,但函数指针的长度不一定相等。下面的代码说明了这个操作:

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));

基本指针用做占位符,用来交换函数指针的值。

警告 一定要确保给函数指针传递正确的参数,否则会造成不确定的行为。

赞(2)

评论 抢沙发

评论前必须登录!

 

C指针