如何声明一个函数指针?

How to declare a function pointer?

我遇到了这两个程序:

int* getb(int* p);
void main()
{
    int x = 5 ;
    int* ptr = getb(&x);
    printf("%d\n",*ptr);
}

int* getb(int* p)
{
    int* re = (int*)malloc(1*sizeof(int));
    *re = *p *= 2;
    return re;
}
void fun(int a) 
{ 
    printf("Value of a is %d\n", a); 
} 

int main() 
{ 

    void (*fun_ptr)(int) = &fun; 

    (*fun_ptr)(10); 

    return 0; 
} 

两个程序中的函数指针声明有什么区别?

int* getb(int* p);

void (*fun_ptr)(int) = &fun; 
int* getb(int* p)

这不是函数指针声明。这是 getb 函数的 前向声明

void (*fun_ptr)(int) = &fun; 

这个一个函数指针变量声明。

请注意,在 C 中,寻址运算符 & 是隐式的,因此这两个语句的行为相同:

void (*fun_ptr)(int) = &fun; 

void (*fun_ptr)(int) = fun; 

看这里:Function pointers and address of a function

int* getb(int* p);

这不是一个函数指针,它是一个 function prototype。 C 编译器不会 "look ahead" 用于函数,因此如果您正在调用尚未定义的函数,则需要在调用位置上方放置一个列出函数参数和 return 类型的原型.这就是第一个程序中发生的事情。

void (*fun_ptr)(int) = &fun; 

这个一个函数指针。它创建一个名为 fun_ptr 的变量,指向函数 fun().

这个声明

int* getb(int* p);

不是函数指针的声明。它是一个函数的声明,该函数具有指向 int 的 return 类型指针,即 int * 和一个相同类型的参数:指向 int.

的指针

函数类型为

int * ( int * )

要声明指向您必须编写的函数类型的指针,例如

int * ( *fun_ptr )( int * ) = getb;

这个声明

void (*fun_ptr)(int) = &fun;

确实是一个指向函数类型void( int )的指针的声明,它由函数fun的地址初始化。

你可以写

void (*fun_ptr)(int) = fun;

因为表达式中使用的函数指示符被转换为指向函数的指针。

并调用用作指针初始化器的函数 fun_ptr 你可以只写

fun_ptr(10);