zoukankan      html  css  js  c++  java
  • 指针函数与函数指针

    一、指针函数

      指针函数,是指带指针的函数,即本质是一个函数。函数都有返回类型(如果不返回值,则为无值型void),只不过指针函数返回类型是某一类型的指针。函数返回值必须用同类型的指针变量来接受,而且,在主调函数中,函数返回值必须赋给同类型的指针变量

      定义格式:

      类型名 *函数名(函数参数列表);

      其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个“指向返回值为…的指针(地址),“类型名”表示函数返回的指针指向的类型”。

      “(函数参数列表)”中的括号为函数调用运算符,在调用语句中,即使函数不带参数,其参数表的一对括号也不能省略

      下面看指针函数的实现:

     1 /*
     2 * 求最大值
     3 * 返回值是int类型,返回两个整数中较大的一个
     4 */
     5 #include <iostream>
     6 #include <tchar.h>
     7 using namespace std;
     8 int *f(int a, int b); // 声明指针函数  
     9   
    10 int _tmain(int argc, _TCHAR* argv[])  
    11 {  
    12     printf("------------------------------ Start
    ");  
    13   
    14     int *p1 = NULL;  
    15     printf("The memeory address of p1 = 0x%x 
    ", p1);  
    16   
    17     p1 = f(1, 2);  
    18   
    19     printf("The memeory address of p1 = 0x%x 
    ", p1);  
    20     printf("*p1 = %d 
    ", *p1);  
    21   
    22     printf("------------------------------ End
    ");  
    23     getchar();  
    24     return 0;  
    25 }  
    26   
    27 /* 
    28  * 指针函数的定义 
    29  * 返回值是指针类型int * 
    30  */  
    31 int *f(int a, int b) {  
    32     int *p = (int *)malloc(sizeof(int));  
    33     printf("The memeory address of p = 0x%x 
    ", p);  
    34     memset(p, 0, sizeof(int));  
    35     *p = a + b;  
    36     printf("*p = %d 
    ", *p);  
    37   
    38     return p;  
    39 }  

      运行结果:

      

      通过运行结果,可以看出,指针函数f返回的类型是一个指针类型,因为f是赋值给int类型指针p1的,如果不是指针类型,编译就会出错。

    二、函数指针

      函数指针是指向函数的指针变量。因而“函数指针”本身首先应该是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整形变量、字符型、数组一样,这里是指向函数。函数指针有两个用途:调用函数和做函数的参数

      函数指针的声明格式如下

      返回值类型 ( * 指针变量名) ([形参列表]);

      注:“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表

      例如:

    1 void (*fptr)();//指针名为fptr,指向一个返回值类型为空,不带参数的函数

      把函数的地址赋值给函数指针,可以采用下面两种形式:

    1 fptr=&Function;
    2 fptr=Function;    //取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址

      如果是函数调用,还必须包含一个圆括号括起来的参数表。可以采用如下两种方式来通过指针调用函数:

    1 x=(*fptr)();
    2 x=fptr();

      第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。

      下面来看例子,首先是用函数指针来调用函数:

     1 /*
     2 * 求最大值
     3 * 返回值是int类型,返回两个整数中较大的一个
     4 */
     5 #include <iostream>
     6 #include <tchar.h>
     7 using namespace std;
     8 int max(int a, int b) {
     9     return a > b ? a : b;
    10 }
    11 
    12 /*
    13 * 求最小值
    14 * 返回值是int类型,返回两个整数中较小的一个
    15 */
    16 int min(int a, int b) {
    17     return a < b ? a : b;
    18 }
    19 
    20 int(*f)(int, int); // 声明函数指针,指向返回值类型为int,有两个参数类型都是int的函数  
    21 
    22 int _tmain(int argc, _TCHAR* argv[])
    23 {
    24     printf("------------------------------ Start
    ");
    25 
    26     f = max; // 函数指针f指向求最大值的函数max  
    27     int c = (*f)(1, 2);
    28 
    29     printf("The max value is %d 
    ", c);
    30 
    31     f = min; // 函数指针f指向求最小值的函数min  
    32     c = (*f)(1, 2);
    33 
    34     printf("The min value is %d 
    ", c);
    35 
    36     printf("------------------------------ End
    ");
    37     getchar();
    38     return 0;
    39 }

      运行结果:

      

      下面是用函数指针作为函数参数的例子:

     1 #include <iostream>
     2 using namespace std;
     3 void MyFun1(int x);
     4 void MyFun2(int x);
     5 void MyFun3(int x);
     6 typedef void(*FunType)(int); //定义一个函数指针类型FunType
     7 void CallMyFun(FunType fp, int x);
     8 
     9 int main(int argc, char* argv[])
    10 {
    11     CallMyFun(MyFun1, 10);   //通过CallMyFun函数分别调用三个不同的函数
    12     CallMyFun(MyFun2, 20);
    13     CallMyFun(MyFun3, 30);
    14     //当然,这样调用也阔以
    15     printf("---------cut-line-----------
    ");
    16     CallMyFun(&MyFun1, 10);
    17     CallMyFun(&MyFun2, 20);
    18     CallMyFun(&MyFun3, 30);
    19 
    20 }
    21 void CallMyFun(FunType fp, int x) //参数fp的类型是FunType。
    22 {
    23     fp(x);//通过fp的指针执行传递进来的函数,注意fp所指的函数是有一个参数的
    24 }
    25 void MyFun1(int x) //这是个有一个参数的函数,以下两个函数也相同
    26 {
    27     printf("函数MyFun1中输出:%d
    ", x);
    28 }
    29 void MyFun2(int x)
    30 {
    31     printf("函数MyFun2中输出:%d
    ", x);
    32 }
    33 void MyFun3(int x)
    34 {
    35     printf("函数MyFun3中输出:%d
    ", x);
    36 }

      运行结果:

      

      

  • 相关阅读:
    PAT A1094 The Largest Generation (25 分)——树的bfs遍历
    PAT A1055 The World's Richest (25 分)——排序
    PAT A1052 Linked List Sorting (25 分)——链表,排序
    PAT A1076 Forwards on Weibo (30 分)——图的bfs
    辅导员
    辅导员面试
    C程序设计
    Excel VBA 基本概念
    Excel函数
    导入excel表的数据到数据库ssh
  • 原文地址:https://www.cnblogs.com/codingmengmeng/p/5881101.html
Copyright © 2011-2022 走看看