Chinaunix首页 | 论坛 | 博客
  • 博客访问: 829003
  • 博文数量: 281
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2770
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-02 19:45
个人简介

邮箱:zhuimengcanyang@163.com 痴爱嵌入式技术的蜗牛

文章分类
文章存档

2020年(1)

2018年(1)

2017年(56)

2016年(72)

2015年(151)

分类: C/C++

2015-10-28 16:25:30

函数指针是指向函数的指针变量。
  因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、 字符型、数组一样,这里是指向函数。如前所述,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]();
}

阅读(975) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~