数组指针,函数指针,函数指针数组小谈。

数组指针

数组指针(也称行指针)
定义 int (*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。

如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]

所以数组指针也称指向一维数组的指针,亦称行指针。
转自:http://www.cnblogs.com/hongcha717/archive/2010/10/24/1859780.html

函数指针

函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
声明格式:类型说明符 (*函数名) (参数)
例如:

int  (*hip)(int x, int y)

函数指针就是要把一个函数的地址赋给它,有如下两种写发,不过取地址运算符并不是必须的,因为一个函数的标识符就表示了它的地址。

hip = &hiphop();
hip = hiphop();

如果是函数调用,还需要一个括号括起来的参数表,它也有两种表示方法,个人建议用第一种,因为它可以清楚的表示是通过指针的方式来调用函数。

x = (*hiphop)();
x= hiphop();

示例

include <stdio.h>    
  void func1(void) // 定义一个函数,以方便下面定义函数指针    
  {    
    printf("test for function pointer.\n");    
  }    
  void (*pFunc)(void);//函数指针的定义    
  pFunc = func1; //函数指针赋值    
  (*pFunc)();//函数指针调用;用函数指针来调用以调用该函数    
  //func(); 调用的第二种写法,效果和上面一样    

再例如,这样比较直观的理解函数指针

#include <stdio.h>    
int Fouc()    
{    
  printf("haha\n");    
  return 10;    
}    
int main()    
{    
  int (*fouc)() = Fouc;    //定义了一个函数指针fouc 
  printf("%p\n",fouc);    //打印fouc指向的地址
 // printf("%p\n",&fouc);  类似于数组,函数名和函数名取地址和函数名都是一样的
  printf("%d\n",fouc());    //这是函数指针函数调用
  printf("%p\n",Fouc);    
  printf("%d\n",Fouc());                                                                                                
}    

得到的结果如下:
在这里插入图片描述
同样的还可以这样表示函数指针如下``
方式1

typedef int (* T)( );
T p = func;

方式2

int *p = func;

方式1定义了一个类型别名 T = int(*)();

函数指针数组重要应用场合 -----转移表

int Add(int x, int y)
{
  return x + y;
}
int Sub(int x, int y)
{
  return x - y;
}
int Mul(int x, int y)
{
  return x * y;
}
int Div(int x,int y)
{
  return x / y; 
}
int Menu()
{
  printf("1,add\n");
  printf("2,sub\n");
  printf("3,mul\n");
  printf("4,div\n");
  int choice = 0;
  scanf("%d",&choice);
  return choice;
}
int main()
{
  int num;
  int choice = Menu();
// 这是一个通常的写法,这样的圈复杂度比较高
//  if(choice == 1)
//  {
//    Add(10,20);
//  }else if (choice == 2)
//  {
//    Sub(10,20);
//  }else if(choice == 3)
//  {
//    Mul(10,20);
//  }else if(choice == 4)
//  {
//    Div(10,20);
//  }
//  可以使用表驱动的方法解决这个问题,即转移表
  typedef int (* T)(int , int );
    T  arr[4]= {
      Add,
      Sub,
      Mul,
      Div
    };
    num = arr[choice - 1](10,20);
    printf("%d",num);
}                             

不过转移表也有缺陷
1,必须适用于相同类型的函数,这样才能输入一个数组。
2.用户选择只能选择整数,如若是浮点型或其他就够呛了。
不过还好的是,以上示例的这样比较常用。

猜你喜欢

转载自blog.csdn.net/weixin_43510732/article/details/86683137