关于函数指针方面的东西,有下面一个程序,可以加深一下对这方面的理解.
#include<stdio.h>
void f(int i)
{
printf("in f() i = %d\n", i);
}
int main()
{
int i;
void (*ptr)(int);
printf("%p %p\n", f, *****f);
f(10);
(***********f)(30);
ptr = f;
ptr(40);
(ptr)(50);
(**********ptr)(55);
i = (unsigned long)f;
(*(void (*)(int))i)(70);
((void (*)(int))i)(90);
((void (*)(int))f)(100);
(*(void (*)(int))f)(120);
return 0;
}
对于这种方式,主要在于C语言中的函数是一种function-to-pointer方式,即对于函数,要将其转化成指针类型的.
ptr是函数指针类型,则*ptr是该指针所指向的函数,而由于函数自身又转化成指针了,所以说*ptr又转化成了ptr这种函数指针类型,因此,前面无论有多少个*号,最后都是对这个函数的调用.
而之前的(**f)(30),这种方式,也是与上面分析的一样,函数转化成函数指针,对该函数指针解引用,又得到函数.所以说这种方式也是正确的.
对于后面的来说,i的值是函数f的地址,前面的(void (*)(int))是一个函数指针的强制转化方式,将该i的值转化成一个函数指针,而该函数指针又是一个带整形参数,且没有返回值的函数.因此((void (*)(int))i)(70)这种方式就是对该函数的一种调用.先将该地址转化成了这种函数指针的方式,然后再去调用,至于最前面的那个*号,可要可不要.所以说两种方式都是正确的.
对于最后面一种方式,也是先将该函数转化成了一个函数指针,然后又去调用这个函数指针.同样也是调用这个函数了.