这两个陈述之间有什么区别:
void (*p) (void *a[],int n)
和
void *(*p[]) (void *a, int n)
答案 0 :(得分:8)
$ cdecl void (*p) (void *a[],int n); declare p as pointer to function that expects (a as array of pointer to void, n as int) returning void; void *(*p[]) (void *a, int n); declare p as array of pointer to function that expects (a as pointer to void, n as int) returning pointer to void;
答案 1 :(得分:2)
在第71页的Expert_C_Programming_Deep_C_Secrets_by_Peter_van_der_Linden中有一种理解这种类型的复杂声明的美妙方式。
据他说:
c中的声明是boustrophedically,即从右到左,从左到右。 看看这个快照
如果您知道如何下载电子书,可以在谷歌上使用。
答案 2 :(得分:0)
void(* p)(void * a [],int n) p是变量名。从上面的行中删除p void(*)(void * a [],int n)。所以p就属于这种类型。这是一个函数的指针。所以p是指向具有该签名的函数的指针。 所以p是一个指向函数的指针,该函数返回void并将'void pointers'和int数组作为参数。
void *(* p [])(void * a,int n) []的优先级高于*。所以p是一个数组。删除p []以上。 所以p是一个void(*)(void * a [],int n)
的数组所以这里p是一个函数指针数组,返回void并将'void pointers'和int数组作为参数。