如何声明一个函数指针?

问题描述 投票:0回答:2

我遇到了这两个程序。

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; 
c function-pointers
2个回答
2
投票
int* getb(int* p);

这不是一个函数指针,是一个 功能原型. C编译器不会对函数进行 "前瞻",所以如果你要调用一个还没有被定义的函数,你需要在调用站点上方放一个原型,列出函数的参数和返回类型。这就是第一个程序中的情况。

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

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


1
投票
int* getb(int* p)

这不是一个函数指针声明。它是一个 远期声明getb 功能。

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

这个 函数指针变量声明。

注意,在C语言中,地址运算符 & 是隐式的,所以这两个语句的行为是一样的。

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

void (*fun_ptr)(int) = fun; 

参见这里 函数指针和函数地址


1
投票

本声明

int* getb(int* p);

不是一个函数指针的声明。它是一个函数的声明,该函数的返回类型指针为int,它的返回类型是 int * 和一个相同类型的参数:int的指针。

函数类型为

int * ( int * )

要声明一个指向函数类型的指针,你必须写下例如

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

本声明

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

确实是对函数类型指针的声明。void( int ) 的地址初始化的。fun.

你可以写

void (*fun_ptr)(int) = fun;

因为在表达式中使用的函数代号会转换为函数的指针。

而要调用作为指针的initiliazer使用的函数。fun_ptr 你可以直接写

fun_ptr(10);
© www.soinside.com 2019 - 2024. All rights reserved.