void(*)void和int(*)int在C中的含义是什么?

时间:2017-11-21 20:42:52

标签: c pointers function-pointers declaration function-declaration

任何人都可以用C解释这两行代码:

void (*pfs)(void) = &fs;        
long int (*pfact)(int) = &fact; 

4 个答案:

答案 0 :(得分:3)

使这些声明更清晰

void (*pfs)(void)=&fs;
long int (*pfact)(int)=&fact; 

您可以为函数声明引入typedef名称,例如

typedef void FUNC1( void );
typedef long int FUNC2( int );

然后写

FUNC1 *pfs = &fs;
FUNC2 *pfact = &fact; 

因此,原始声明声明指向指定类型的函数的指针,并使用给定函数的地址初始化它们。

这是一个示范程序

#include <stdio.h>

typedef void FUNC1( void );
typedef long int FUNC2( int );

void fs( void )
{
    puts( "Hello Islacine" );
}

long int fact( int x )
{
    return x;
}

int main(void) 
{
    FUNC1 *pfs = &fs;
    FUNC2 *pfact = &fact;

    pfs();

    printf( "sizeof( long int ) = %zu\n", sizeof( pfact( 0 ) ) );

    return 0;
}

它的输出可能看起来像

Hello Islacine
sizeof( long int ) = 8

考虑到而不是

    FUNC1 *pfs = &fs;
    FUNC2 *pfact = &fact;

或代替

    void (*pfs)(void)=&fs;        
    long int (*pfact)(int)=&fact; 
你甚至可以写

    FUNC1 *pfs = fs;
    FUNC2 *pfact = fact;

    void (*pfs)(void) = fs;        
    long int (*pfact)(int) = fact; 

因为在极少数例外的表达式中,函数指示符被转换为指向函数的指针。

你甚至可以写:)

    FUNC1 *pfs = *****fs;
    FUNC2 *pfact = *****fact;

    void (*pfs)(void) = *****fs;        
    long int (*pfact)(int) = *****fact; 

来自C标准(6.3.2.1 Lvalues,数组和函数指示符)

  

4函数指示符是具有函数类型的表达式。   除非它是sizeof operator65)或一元&amp;的操作数。   operator,一个函数指示符,类型为''函数返回类型''   转换为具有类型''指向函数的指针的表达式   返回类型''。

答案 1 :(得分:3)

此语法定义函数指针。您可以像这样使用它们:

void a() {
    //do something
}

int main() {
    void (*functionPointer)();
    functionPointer = a;
    //or
    functionPointer = &a;

    //call the funcion pointer as you would a regular function
    functionPointer();
}

使用函数指针的主要原因是使回调函数和&#34;跳转表&#34; (这是引号,因为函数指针数组实际上不是跳转表。真正的跳转表只能用汇编语言编写。)

答案 2 :(得分:2)

它们是函数指针。在您的示例中:

void (*pfs)(void)=&fs;

您正在创建名为&#34; pfs&#34;的变量。此变量具有不带参数且不返回任何参数的函数类型。

以下内容使您的示例更加清晰。

return_type (*variable_name) (argument_list)

如果您了解上半部分,那么=符号的右侧非常容易。

我们所做的就是分配函数的位置&#34; fs&#34;我们的函数指针(变量)&#34; pfs&#34;。

以下是演示上述解释的完整示例。

#include <stdio.h>
void my_print_method(int number) {
    printf("The number is: %d", number);
}
int main() {
    // Declare our function pointer variable
    void (*printer)(int);

    // Assign our function pointer 'printer' to the method 'my_print_method'
    printer = &my_print_method

    // We can also assign the method to our function pointer as such:
    printer = my_print_method

    // Use our function pointer as if it were a function
    (*printer)(55);

    // Keep in mind that that in C we can simply write the function call as such:
    printer(55);

}

答案 3 :(得分:1)

  

void(*)(void)和int(*)(int)在C?

中的含义是什么

它们只是指向函数的指针,该函数采用void参数并返回void。

void (*pfs)(void)=&fs; 

pfs是一个指向函数的指针,该函数将void作为参数并返回void。 这已经初始化了相同签名类型的功能,即fs。

long int (*pfact)(int)=&fact; 

pfact是一个指向函数的指针,该函数将int作为参数并重新引入long int。 赋值pfact指向函数后。

附加说明:

有阅读复杂声明的工具。其中一个是https://cdecl.org/。 另外,正如其他人指出的更好的指向函数的方法是typdef。