指向函数的指针

来源:互联网 发布:淘宝官方营销活动 编辑:程序博客网 时间:2024/04/29 09:11

      在C语言中,函数本身不是变量,但每个函数也有其入口地址,这个地址是在编译的时就被分配的,这个地址也称为函数的指针。因此,用户可以定义指向函数的指针,这种指针可以被赋值、存放于数组中,传递给函数及作为函数的返回值等。

      函数指针的一般形式为:

      数据类型(*指针变量名)()

      例如:

      int (*p)();

      char(*n)();

      这样就定义指定返回值的函数指针。例如,在“int (*p)();”中定义的是返回值为int的函数指针,同样“char(*n)();”中定义的是返回值为char的函数指针。由该定义可以看出,函数指针在定义时并没有指明它具体指向哪个函数,将其指向一个具体的函数的过程就是函数指针的初始化,如下所示:

       p=sum;

       当然,在此之后,该函数指针还能指向其他具有同样返回值的函数,这在函数指针的使用中是非常常见的。

       对于函数指针的使用,有以下几个注意要点。

      1. 在定义或声明函数指针是,“*”两边的括号是不能省略的,因为如果将括号省略,指针变量名右边的括号的优先级高于“*”,因此,此时就相当于“int*(p());”,这里的意义是返回值为指针的函数,并不是指向函数的指针。

      2. 在给函数指针赋值的时,只需给给出函数名而不需给出具体的参数,因此此时是将函数入口地址赋给函数指针,而不涉及任何实参和形参的结合问题。

      3. 对于指向函数的指针变量,像p+n,p++等都是没有意义的。

      下例中显示了函数指针的基本使用方式。

     #include<stdio.h>

      void hello_num(int num)

      {

              int i;

              for(int i=0;i<num;i++)

             {

                   printf("helloworld ,num is  %d/n",i);

             }

      }

      void hello(void)

     {

              printf("helloworld , no num/n");

     }

     void main()

    {

              void (*p)();

              p=hello_num;

              int a=5;

              (*p)(5);

              p=hello;

              (*p)();

     }

      程序执行结果如下:

      helloworld,num is  0 

      helloworld,num is  1

      helloworld,num is  2

      helloworld,num is  3

      helloworld,num is  4

      helloworld,no num

      由上例可以看出,函数指针在定义或声明时,其数据类型必须与函数的返回值相一致。函数指针可以指向多个不同的函数,用户可以根据需要将函数指针设为另一函数的形参,在调用时通过函数指针来选用不同的函数,这就是所谓的回调函数的原理。