c中的`void *ptr[N](int)`和`void (*ptr)[N](int)`有什么区别?

pus*_*hpa 0 c pointers function operator-precedence

假设我有\nvoid (*ptr[3])(int) \n并且\nvoid (*ptr)[3](int)

\n

第一个按预期工作。\n但第二个抛出错误。

\n

我尝试了这两种方法,但无法找出问题所在。\n错误内容如下:

\n
\n

“..错误:将 \xe2\x80\x98ptr\xe2\x80\x99 声明为函数数组 void\n(*ptr)3;”

\n
\n

Ted*_*gmo 5

void (*ptr)[3](int)ptr与声明为函数数组的指针相同,这是不允许的。你不能有函数数组。

typedef void(functype)(int);
functype ptr[3];              // error
Run Code Online (Sandbox Code Playgroud)

您需要的很可能是一个函数指针数组这就是您的工作声明void (*ptr[3])(int)创建的。

typedef void(functype)(int);
functype* ptr[3];
//      ^
Run Code Online (Sandbox Code Playgroud)

使用示例:

void a(int x) {}
void b(int x) {}
void c(int x) {}

int main(void) {
    typedef void(functype)(int);

    functype* ptr[3] = {a,b,c};
}
Run Code Online (Sandbox Code Playgroud)