任何人都可以解释以下说明:
int *c[10];
char *(**n)(void);
float *(**r(void))[6];
short *(**v(void))(int);
long *(*(*(*z)(void))[7])(void);
答案 0 :(得分:4)
http://www.cdecl.org/将解释所有这些陈述。 C Right-Left rule解释了如何很好地阅读C声明。还有许多其他可用资源,尤其是in this question。
答案 1 :(得分:2)
由于这是你的作业,你不会通过我告诉你一切来学习这一点;)但是,一个提示。您可以创建并传递指向C中函数的指针,而不仅仅是变量。
除第一个示例之外的所有函数参数都是函数指针的原型。
假设我们有一个用于测试颜色的库,我们可能希望允许我们库的用户提供获取颜色名称的自定义方法。我们可以定义一个结构供用户传入,包含我们可以调用的回调。
struct colour_tester {
char *(*colour_callback)(void);
}
// test the user's function if given
void run_test(struct colour_tester *foo ){
// use the callback function if set
if ( foo->colour_callback != NULL ){
char * colour = (*foo->colour_callback)();
printf( "colour callback returned %s\n", colour );
}
}
然后,库的用户可以自由定义这些回调函数的实现,并将它们作为函数指针传递给我们。
#include <colour_tester.h>
char * get_shape_colour(){
return "red";
}
int main ( int argc, char** argv ) {
// create a colour tester and tell it how to get the colour
struct colour_tester foo;
foo.colour_callback = &get_shape_colour;
run_test( &foo );
}
我已经让你去解决那些有额外数量的* s的事情。