当前所在位置:珠峰网资料 >> 计算机 >> 计算机等级考试 >> 正文
函数与函数指针
发布时间:2010/5/17 11:20:05 来源:城市学习网 编辑:ziteng
  在学习C++的回调函数机制时有一个关于函数名和函数指针的疑惑,如是就自己研究了下二者的关系。
  快速排序的原型:
  void qsort(void *base, size_t nelem, size_t width, int (_USERENTRY *fcmp)(const void *, const void *));
  可见qsort接受一个类型为_USERENTRY的函数指针fcmp,但是下面代码中qsort函数接受一个函数名,却不是一个函数指针。而函数名和函数指针的关系如何呢?
  代码
  #include <stdio.h>
  #include <stdlib.h>
  int sort_function( const void *a, const void *b);
  int list[5] = { 54, 21, 11, 67, 22 };
  int main(void)
  {
  int x;
  qsort((void *)list, 5, sizeof(list[0]), sort_function);
  for (x = 0; x < 5; x++)
  printf("%i\n", list[x]);
  return 0;
  }
  int sort_function( const void *a, const void *b)
  {
  return *(int*)a-*(int*)b;
  }
  函数指针实际上就是该函数代码段开始的地址。其实,编译器对于函数名、函数指针都是转换为一个地址,这个地址就是该函数代码起始地址。 [NextPage]   下面的代码说明了函数名和函数指针的关系:
  代码
  #include<stdio.h>
  void MyFun(int x);
  typedef void (*FunP)(int);
  FunP fp1 = NULL, fp2 = NULL, fp3 = NULL, fp4 = NULL ;
  int main(int argc, char* argv[])
  {
  MyFun(10);                        //这里是调用MyFun(10);函数
  fp1=&MyFun;                       //将MyFun函数的地址赋给FunP变量
  (*fp1)(20);                        //通过函数指针变量FunP来调用MyFun函数的。
  fp2=&MyFun;
  fp2(30);
  fp3=MyFun;
  fp3(40);
  fp4=MyFun;
  (*fp4)(50);
  return 0;
  }
  void MyFun(int x)                     //这里定义一个MyFun函数
  {
  printf("%d\n",x);
  }
  1. 可见,MyFun的函数名与FunP函数指针都是一样的,即都是函数指针。MyFun函数名是一个函数指针常量,而FunP是一个函数数指针变量,这是它们的关系。
  2. 但函数名调用如果都得如(*MyFun)(10);这样,那书写与读起来都是不方便和不习惯的。所以C语言的设计者们才会设计成又可允许MyFun(10);这种形式地调用        (这样方便多了并与数学中的函数形式一样)。
  3. 为统一起见,FunP函数指针变量也可以FunP(10)的形式来调用。
  4. 赋值时,即可FunP=&MyFun形式,也可FunP=MyFun。
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved