函数指针定义

(33)设有以下函数:
void fun(int n,char *s) {……}
则下面对函数指针的定义和赋值均正确的是( )。
A)void (*pf)(); pf=fun; B)void *pf(); pf=fun;
C)void *pr(); *pf=fun; D)void(*pf)(int,char);pf=&fun;
答案是D。
详细分析一下!

  函数指针:
  函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。
  函数指针的声明方法为:
  返回值类型 ( * 指针变量名) ([形参列表]);
  注1:“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:
  int func(int x); /* 声明一个函数 */
  int (*f) (int x); /* 声明一个函数指针 */
  f=func; /* 将func函数的首地址赋给指针f */
  或者使用下面的方法将函数地址赋给函数指针:
  f = &func;
  赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
  注2:函数括号中的形参可有可无,视情况而定。
  下面的程序说明了函数指针调用函数的方法:
  例一、

  #include<stdio.h>
  int max(int x,int y){return (x>y? x:y);}
  int main()
  {
  int (*ptr)(int, int);
  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);
  return 0;
  }
  

  ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你想怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数。不过注意,指向函数的指针变量没有++和--运算,用时要小心。
  不过,在某些编译器中这是不能通过的。这个例子的补充如下。
  应该是这样的:
  1.定义函数指针类型:
  typedef int (*fun_ptr)(int,int);
  2.声明变量,赋值:
  fun_ptr max_func=max;
  也就是说,赋给函数指针的函数应该和函数指针所指的函数原型是一致的。
  例二、

  #include<stdio.h>
  void FileFunc()
  {
  printf("FileFunc\n");
  }
  void EditFunc()
  {
  printf("EditFunc\n");
  }
  void main()
  {
  typedef void(*funcp)();
  funcp pfun=FileFunc;
  pfun();
  pfun=EditFunc;
  pfun();
  }
  
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-14
应该说,没有正确的,因为函数指针申明的时候,参数类型要与指向函数的参数类型一样。正确的应如下:
void (*pf)(int,char*);
pf=fun;本回答被网友采纳
第2个回答  推荐于2017-09-06
我告诉你,你的答案是错的,答案是A。
定义一个指向函数的指针变量的一般形式为:类型标识符(*指针变量名)();
在定义了指向函数的指针变量之后,可讲一个函数的入口地址赋给它,也就是把函数名赋值给它,这样就使此指针变量指向了一个指定的函数。本回答被提问者采纳
第3个回答  2011-03-14
给pf赋值的只能是指针(因为pf是指针)C中函数无型参

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网