先说几个概念:
p[0]就是*p 就是p所指向的内存中的值
&p是p这个指针本身的地址,&p的类型是int**
&p[0]就是p[0]的地址,也就是p
(&p)[0],就是*(&p),也是p
*p,就是前面说的p[0]
p是一个指针变量的名字,表示此指针变量指向的内存地址,如果使用%p来输出的话,它将是一个16进制数。
*p表示此指针指向的内存地址中存放的内容,一般是一个和指针类型一致的变量或者常量。
&是取地址运算符,&p就是取指针p的地址
int fun1(void)
{
printf("fun1\n" );
return 1;
}
int fun2(void)
{
printf("fun2\n" );
return 1;
}
int fun3(void)
{
printf("fun3\n" );
return 1;
}
typedef int (* pf)(void);
int main(int argc, char const *argv[])
{
int i;
const pf array[] = {fun1,fun2,fun3}; //函数指针数组(只读)
const pf *p; //指向函数指针的指针(*p只读)
//等价于p=array,array和&array[0]作为右值时,都是表示数组首元素的首地址。
p = &array[0]; //把第一个元素的地址赋给p
i = sizeof(array)/sizeof(array[0]); //获取数组元素个数
for (; i; i--,p++)
{
if (p[0]) //p[0]就是*p,就是指针p指向的内存中的值
{
printf("%d\n", (int)p[0]);
(*p[0])(); //通过函数指针调用函数
}
}
return 0;
}