我对编程有点生疏,所以来这里是为了问这行是什么意思?
int (*f)(int, int)
答案 0 :(得分:6)
使用 https://cdecl.org/ 来翻译类似的东西。
int (*f)(int, int)
=> 将 f 声明为指向返回 int 的函数 (int, int) 的指针。
答案 1 :(得分:2)
它将 f
声明为一个指向带有两个 int
参数并返回一个 int
的函数的指针:
f -- f
(*f) -- is a pointer to
(*f)( ) -- a function taking
(*f)( ) -- unnamed parameter
(*f)(int, ) -- is an int
(*f)(int, ) -- unnamed parameter
(*f)(int, int) -- is an int
int (*f)(int, int) -- returning int
函数指针通常在您处理回调(qsort
库函数可能是规范示例)或在共享或动态加载的库中使用函数时使用:
int (*f)(int, int) = dlsym( shared_lib, "foo" );
它们对于构建表驱动代码也很方便——我曾经写过一个实用程序来加载和解析来自各种科学仪器的不同类型的数据文件,并将它们加载到数据库中,每个文件的格式都略有不同工具和数据类型。因此,我构建了一个以仪器和数据类型为键的表,并带有指向相应解析函数的指针:
struct parser_lookup {
char *instrument; // name of the instrument
char *type; // sample data, calibration data, etc.
void (*parser)( const char *fname, db_handle *db );
} parser_table =
{
{ "GRA", "DAT", parse_gra_dat },
{ "GRA", "CAL", parse_gra_cal },
{ "SHR", "DAT", parse_shr_dat },
{ "SHR", "CAL", parse_shr_cal },
...
};
然后我有一个函数来搜索表格:
void (*get_parser( const char *filename ))(const char *, db_handle * )
{
// Extract instrument and data type from the file name,
// search the table and return the appropriate function pointer
// or NULL
}
然后在我的主代码中
db_handle *db;
char *fname;
...
while ( (fname = next_file_in_queue()) )
{
void (*parse)(const char *, db_handle *) = get_parser( fname );
if ( parse )
parse( fname, db );
}
这样,当添加新工具时,我所要做的就是编写一个新的解析函数并向查找表添加一个条目 - 我不必触及主要的应用程序逻辑。
答案 2 :(得分:0)
int (*f)(int, int)
f
是一个指向函数的指针,该函数返回一个整数并接受两个整数作为参数。您可以在该指针变量上存储一个引用(如果您在该语句前面加上一个 typedef
粒子,那么您将定义一个指向函数类型的指针)一个引用(仅使用函数名称,不带“()”括号)到任何接受两个整数并返回一个整数的函数,然后使用以下方法调用该函数(可以动态分配给指针,因此可以更改调用的函数):
int a = (*f)(3, 4);
或更简单的缩写:
int a = f(3, 4);
(这将调用您在 f
中存储其引用的实际函数)