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 }

      运行结果:

      

      

  • 相关阅读:
    记php多张图片合成一张图片 压缩固定分辨率 合并生成竖列 纵向长图(可用于商品详情图合并下载)
    记php-mysql分页查询出现重复数据
    记laravel order by 问题
    记登录注册时候 前端js明文密码 加密传输 php解密
    记下载oss图片接口(附带删除)
    记tp5.1使用composer PhpOffice的xlsx表格文件导入数据库
    记php移动并压缩多级目录文件为zip文件并上传oss
    Jmeter服务器性能监控工具插件之ServerAgent
    Jmeter阶梯式加压测试
    Jmeter 下载+安装+汉化+版本更新+备份使用(Jmeter 4+版本均适用)
  • 原文地址:https://www.cnblogs.com/codingmengmeng/p/5881101.html
Copyright © 2011-2022 走看看