函数指针的一个例子以及*p和p[0]的关系

先说几个概念:
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;
}

猜你喜欢

转载自blog.csdn.net/vonvingon/article/details/78374450
今日推荐