关于利用结构体数组来调用函数从而实现程序分支的有关问题

关于利用结构体数组来调用函数从而实现程序分支的问题

int Nkey,a=5,b=2;
/*-----------------------------------------------*/
void   menu_8(int   Nkey)
{
a=b*Nkey;
}
void   menu_9(int   Nkey)
{
a=a-Nkey;
}
void   menu_10(int   Nkey)
{
a=a+Nkey;
}
/*-----------------------------------------------*/
struct   view_menu_table
{   int   ViewID;
    void   (*pViewMenu)(int   Mkey);
}ViewFunTab[]={0,menu_8,1,menu_9,2,menu_10};


main()
{int   i;
for(i=0;i <=2;i++)
{ switch(i)
{case 0   :   (*ViewFunTab[i].pViewMenu)(1);
  break;
  case 1   :   (*ViewFunTab[i].pViewMenu)(2);
  break;
  case 2   :   (*ViewFunTab[i].pViewMenu)(3);
  break;
  default:   break;
}
}
}

在这个程序中,当i=0时调用menu_8函数,i=1调用menu_9数,i=2调用menu_10函数,
而在结构体数组中为ViewFunTab[]={0,menu_8,1,menu_9,2,menu_10},表面看起来
是定义了6个结构体元素,而0/1/2却实际代表了调用menu_8/menu_9/menu_10时的标号,
怎么理解呢?

------解决方案--------------------
ViewFunTab[]={0,menu_8,1,menu_9,2,menu_10}


只定义了三个数组元素,一个元素有两个字段
ViewFunTab[0].VierId =0;
ViewFunTab[0].pViewMenu=menu_8;

以此类推
------解决方案--------------------
struct view_menu_table
{ int ViewID;
void (*pViewMenu)(int Mkey);
}ViewFunTab[]={0,menu_8,1,menu_9,2,menu_10};


struct view_menu_table
{ int ViewID;
void (*pViewMenu)(int Mkey);
}ViewFunTab[]={{0,menu_8},{1,menu_9},{2,menu_10}};
是一样的
------解决方案--------------------
表面看起来
是定义了6个结构体元素,而0/1/2却实际代表了调用menu_8/menu_9/menu_10时的标号,
怎么理解呢?
=======
表面看起来就是定义了 3 个元素:
ViewFunTab[]={ {0,menu_8},{1,menu_9},{2,menu_10} };
这样是不是明了一些?

ViewFunTab 数组有三个元素,
每个元素由一个 ID和一个fun入口 构成,
根据 ID 读取对应的 fun入口进行函数调用, 很好理解么 ...