首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

哪位高手能帮小弟我解释下,什么是指向函数的指针

2012-03-11 
谁能帮我解释下,什么是指向函数的指针谁能帮我解释下,什么是指向函数的指针[解决办法]转帖:1,这两个概念都

谁能帮我解释下,什么是指向函数的指针
谁能帮我解释下,什么是指向函数的指针

[解决办法]
转帖:
1,这两个概念都是简称,指针函数是指带指针的函数,即本质是一个函数。我们知道函数都又返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。其定义格式如下所示: 
  返回类型标识符 *返回名称(形式参数表) 
  { 函数体 } 
  返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。例如下面一个返回指针函数的例子: 
  #include 
  float *find(); 
  main() 
  { 
  static float score[][4]={{60,70,80,90},{56,89,34,45},{34,23,56,45}}; 
  float *p; 
  int i,m; 
  printf("Enter the number to be found:"); 
  scanf("%d",&m); 
  printf("the score of NO.%d are:\n",m); 
  p=find(score,m); 
  for(i=0;i<4;i++) 
  printf("%5.2f\t",*(p+i)); 
  } 
  float *find(float(*pionter)[4],int n)/*定义指针函数*/ 
  { 
  float *pt; 
  pt=*(pionter+n); 
  return(pt); 
  } 
  学生学号从0号算起,函数find()被定义为指针函数,起形参pointer是指针指向包含4个元素的一维数组的指针变量。pointer+1指向score的第一行。*(pointer+1)指向第一行的第0个元素。pt是一个指针变量,它指向浮点型变量。main()函数中调用find()函数,将score数组的首地址传给pointer. 
  2,“函数指针”是指向函数的指针变量,因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上一致的。函数指针有两个用途:调用函数和做函数的参数。函数指针的说明方法为: 
  数据类型标志符 (*指针变量名)(参数);注:函数括号中的参数可有可无,视情况而定。 
  下面的程序说明了函数指针调用函数的方法: 
  #include 
  int max(int x,int y){ return(x>y?x:y); } 
  void main() 
  { 
  int (*ptr)(); 
  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是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你像怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数,不过注意,指向函数的指针变量没有++和--运算,用时要小心。

[解决办法]
函数指针是c语言的函数模板,定义泛形指针函数,运行是动态指定具体函数
[解决办法]
you can pass the function pointer as a parameter into another function. For example,

#include <stdio.h>

typedef void (*MyFuncPtr)(const char*);

void hello(const char* s)
{
printf("hello, %s\n",s); 
}

void shakehand(const char* s)
{
printf("let's shake hands, %s\n", s); 
}

void printmessage(MyFuncPtr ptr, const char* s)
{
(*ptr)(s);
}

int main()
{
char * s = "peng_peng";

MyFuncPtr pf= hello;
printmessage(pf, s);
  
pf= shakehand;
printmessage(pf, s);
  
return 0;
}

[解决办法]
此程序段运行完返回的是指针类型
[解决办法]
就是函数的入口地址。
那么多函数,都装在代码段中,每一个函数肯定要有个起启位置吧?否则还不乱套了。
[解决办法]

C/C++ code
 

#include "stdio.h"

/*一个函数*/
void print_hello()
{
  printf("hello\n");
}

int main()
{
  void (*pfun)() = &print_hello;  // 得到函数的指针

  (*pfun)();  // 用函数指针调用函数

  return 0;
}


[url=http://www.pconline.com.cn/pcedu/empolder/gj/c/0503/566020.html][/url]





[解决办法]
  如楼上大家所言,函数指针就是指向函数代码入口的指针。但还有一点需引起重视,即函数指针的类型。

在《C++ Primer》上似乎没有函数指针类型的明确定义,但它说函数指针的类型就是指函数的返回类型和函数标记(参数类型及个数),例如:

void func1(double const& _d = 0.0)
{
cout << "func1浮点数:" << _d << endl;
}

double func2(double const& _d = 0.0)
{
cout << "func2浮点数:" << _d << endl;
return _d;
}

void func3(long const& _l = 0)
{
cout << "func3浮点数:" << _l << endl;
}

void func4(double const& _d = 0.0,long const& l =0)
{
cout << "func2浮点数:" << _d << endl;
} 

我们声明一个函数指针类型:

typedef void (*_PtrFunc)(double const&);

上述函数指针类型限定了该指针只能指向的函数类型,即有一个double常型引用参数且无返回值的函数。


因此,在如下程序中:

int main() 

_PtrFunc _p1 = func1;//Ok!
(_p1)(0.03);

_p1 = func2;//生成错误,类型不匹配!
_p1(0.04);

/*如下语句生成:
errorC2440"=":无法从"void(__cdecl *)(const long &)"转换为"_PtrFunc"
*/
_p1 =func3;

/*如下语句生成:
errorC2440"="无法从"void(__cdecl *)(const double &,const long &)"
转换为"_PtrFunc"
*/
_p1 = func4;


_PAUSE;
return 0;
}

如注释,只有第一个语句"PtrFunc _p1 = func1;"正确,这充分说明了,函数指针是有类型属性的!



热点排行