任何人都可以用C解释这两行代码:
void (*pfs)(void) = &fs;
long int (*pfact)(int) = &fact;
答案 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。