`
andyliuxs
  • 浏览: 136460 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

函数指针和函数数组

阅读更多

原文地址:http://blog.csdn.net/dragoniye/archive/2008/12/17/3537701.aspx

函数指针是指向函数的指针变量。
  因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上一致的。函数指针有两个用途:调用函数和做函数的参数。函数指针的说明方法为:
  数据类型标志符 (*指针变量名)(参数);
 int (*ptr)();
  注:函数括号中的参数可有可无,视情况而定。
  下面的程序说明了函数指针调用函数的方法:
  #include
  int max(int x,int y){ return(x>y?x:y); }
  void main()
  {
  int a,b,c;
  ptr=max;
  scanf("%d,%d",&a,&b);
  c=(*ptr)(a,b);
  printf("a=%d,b=%d,max=%d",a,b,c);
  }
  ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你像怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数,不过注意,指向函数的指针变量没有++和--运算,用时要小心。
  不过,在某些编译器中这是不能通过的。这个例子的补充如下。
  应该是这样的:
  1.定义函数指针类型:
  typedef int (*fun_ptr)(int,int);
  2.申明变量,赋值:
  fun_ptr max_func=max;
  也就是说,赋给函数指针的函数应该和函数指针所指的函数原型是一致的。

 

// 函数定义
void fun1() { printf("function 1 "); }
void fun2() { printf("function 2 "); }
void fun3() { printf("function 3 "); }
void fun4() { printf("function 4 "); }


// 方法1
// 函数数组定义并赋初值
void (*p[])() = { fun1, fun2, fun3, fun4 };

// 调用数组中的函数
for(int i=0; i < 4; i++)
{
    p[i]();
}


// 方法2
typedef void (*PFUN)();  // 定义函数指针

PFUNC funArray[] = { fun1, fun2, fun3, fun4 };

// 调用数组中的函数
for(int i=0; i < 4; i++)
{
    funArray[i]();
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics