Обучение программированию предполагает много экспериментов. Крошечная программа ниже показывает, что ваше предположение *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
Такие эксперименты дадут вам больше понимания этой топи c чем 1000 онлайн вопросов. Приложите некоторые усилия в вашем обучении. Если вы чего-то не понимаете - напишите что-то вроде этого и посмотрите, как это работает.