首页 > 代码库 > 第一周 从C走进C++ 001 函数指针

第一周 从C走进C++ 001 函数指针

 

1. 基本概念:

  程序运行期间,每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址(也称“入口地址”)。我们可以将函数的入口地址赋给一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以调用这个函数。这种指向函数的指针变量称为“函数指针”。

                                  

 

2. 定义形式
  类型名 (* 指针变量名)(参数类型1, 参数类型2,…);

  例如:
    int (*pf)(int ,char);
表示pf是一个函数指针,它所指向的函数,返回值类型应是int,该函数应有两个参数,第一个是int 类型,第二个是char类型。

3. 使用方法
  可以用一个原型匹配的函数的名字给一个函数指针赋值。
  要通过函数指针调用它所指向的函数,写法为:
    函数指针名(实参表);

#include <stdio.h> void PrintMin(int a,int b)  {   if( a<b )       printf("%d",a);   else       printf("%d",b); } int main() {     void (* pf)(int ,int);     int x = 4, y = 5;         pf = PrintMin;        pf(x,y);       return 0; } 

4. 函数指针和qsort库函数
  C语言快速排序库函数:
    void qsort(void *base, int nelem, unsigned int width, int ( * pfCompare)( const void *, const void *));
可以对任意类型的数组进行排序。

                

  实例:

    下面的程序,功能是调用qsort库函数,将一个unsigned int数组按照个位数从小到大进行排序。比如 8,23,15三个数,按个位数从小到大排序,就应该是 23,15,8 。

 

#include <stdio.h> #include <stdlib.h> int MyCompare( const void * elem1, const void * elem2 ) {   unsigned int * p1, * p2;   p1 = (unsigned int *) elem1;   p2 = (unsigned int *) elem2;   return  (* p1 % 10)  - (* p2 % 10 );  } #define NUM 5 int main()    {   unsigned int an[NUM] = { 8,123,11,10,4 };   qsort( an,NUM,sizeof(unsigned int), MyCompare);     for( int i = 0;i < NUM; i ++ )     printf("%d ",an[i]);   return 0; }