C中函数指针数组的表达

Expression of array of function pointer in C

我是 C 初学者,我了解到指针可以用数组表示,反之亦然。
点赞*p == p[0]p[1][2] == *(*(p+1)+2)
这些会导致*p[i](arg1, arg2) == p[0][i](arg1, arg2)吗?

Does these lead to *p[i](arg1, arg2) == p[0][i](arg1, arg2)?

实际上,*p[i](arg1, arg2) 被解析为 *(p[i](arg1, arg2)) - 它对函数调用的结果应用 * 取消引用运算符。

p[0][i](arg1, arg2) 等于 (*p)[i](arg1, arg2).

学习编程需要大量的实验。下面的小程序表明你的假设 *p[2] == p[0][2] 是错误的。

#define f(x)  void f ## x(void) {printf("Func = %d\n", x);}

f(10);f(11);f(12);
f(20);f(21);f(22);
f(30);f(31);f(32);


int main()
{
    void (*p[3][3])(void) = {{f10, f11, f12}, {f20, f21, f22}, {f30, f31, f32}};

    for(int x = 0; x < 3; x++)
    {
        for(int y = 0; y < 3; y++)
        {
            printf("%p\t", (void *)p[x][y]);
        }
        printf("\n");
    }

    printf("\np[0][2] = %p\n", (void *)p[0][2]);
    printf("*p[2] = %p\n", (void *)*p[2]); 
}

结果:

0x4005b2    0x4005cd    0x4005e8    
0x400603    0x40061e    0x400639    
0x400654    0x40066f    0x40068a    

p[0][2] = 0x4005e8
*p[2] = 0x400654

这样的实验比 1000 道在线问题更能让你理解这个主题。在学习上付出一些努力。如果你不明白某些东西 - 写这样的东西看看它是如何工作的。

函数指针的行为就像普通的对象指针。表达式中使用的数组将衰减为指针( 不是 反之亦然!),这允许我们使用 [] 运算符,这又要求左操作数是一个指针。

这里有解释:

您的特定代码的问题在于 [] 等后缀运算符优先于 * 等一元运算符。意思是 (*p)[i](arg1, arg2) 等同于 p[0][i](arg1, arg2)。后者显然是首选,因为它更具可读性。