zoukankan      html  css  js  c++  java
  • C语言基础学习6: 指向函数的指针

    1、函数指针变量调用函数

     1 #include <stdio.h>
     2 int max(int x, int y);
     3 int max(int x, int y)
     4 {
     5     int z;
     6     if(x<y)
     7         z = y;
     8     else
     9     z = x;
    10     return z;
    11 }
    12 void main()
    13 {
    14     int a,b,c;
    15     scanf("a=%d,b=%d",&a,&b);
    16     c = max(a,b);
    17     printf("max = %d
    ",c);
    18 }
    View Code

    用函数指针调用函数:

     1 #include <stdio.h>
     2 int max(int x, int y);
     3 int max(int x, int y)
     4 {
     5     int z;
     6     if(x<y)
     7         z = y;
     8     else
     9     z = x;
    10     return z;
    11 }
    12 void main()
    13 {
    14     int a,b,c;
    15     int (*p)(int x, int y);
    16     scanf("a=%d,b=%d",&a,&b);
    17     p = max;
    18     c = (*p)(a,b);
    19     printf("max = %d
    ",c);
    20 }
    View Code

    指针变量可以指向整型、字符串、数组,也可以指向一个函数。一个函数在编译时被分配一个入口地址,这个函数的入口地址就称为函数的指针。可以用一个指针变量指向这个函数,然后通过该指针变量调用此函数。

    指向函数的指针变量的一般定义形式为:

    数据类型 (*指针变量名)(函数参数列表)

    例如上面的 int (*p)(int x, int y);

    这里注意圆括号不能省去,因为()的优先级高于*,声明成了一个p函数,函数的返回值是指向整型变量的指针。

    p = max; 作用是将函数max的入口地址赋给指针变量p。

    和数组名表示数组首元素地址类似,函数名代表该函数的入口地址。

    因此函数的调用可以通过函数名调用,也可以通过函数指针调用(即用指向函数的指针变量调用)。

    注意:

    (1)int (*p)(int x, int y); 表示一个指向函数的指针变量p,它不是固定指向哪一个函数的,而只是表示定义了这样一个类型的变量,它是专门用来存放函数的入口地址的。在一个程序中,一个指针变量可以先后指向同类型的不同函数。

    (2)在给函数指针变量赋值时,只需给出函数名而不必给出参数,例如:p=max;因为是将函数入口地址赋给p,而不牵涉实参与形参的结合问题。

    (3)用函数指针变量调用函数时,只需将(*p)代替函数名即可(p为指针变量名)。例如:c = (*p)(a, b);

    (4)对指向函数的指针变量,像p+n,p++,p--等运算是无意义的。

    2、用指向函数的指针作函数参数

    函数指针变量通用的用途之一是把指针作为参数传递到其它函数。

    函数的参数可以是变量、指向变量的指针变量、数组名、指向数组的指针变量,指向函数的指针也可以作为参数,以实现函数地址的传递,这样就能够在被调用的函数中使用实参函数。

     1 #include <stdio.h>
     2 int max(int x, int y);
     3 int min(int x, int y);
     4 int sum(int x, int y);
     5 void process(int x, int y, int (*p)(int x, int y));
     6 int max(int x, int y)
     7 {
     8     int z;
     9     if(x>y)
    10         z = x;
    11     else
    12         z = y;
    13     return z;
    14 }
    15 int min(int x, int y)
    16 {
    17     int z;
    18     if(x>y)
    19         z = y;
    20     else
    21         z = x;
    22     return z;
    23 }
    24 int sum(int x, int y)
    25 {
    26     int z;
    27     z = x + y;
    28     return z;
    29 }
    30 void process(int x, int y, int (*p)(int x, int y))
    31 {
    32     int z;
    33     z = (*p)(x,y);
    34     printf("%d
    ",z);
    35 }
    36 
    37 void main()
    38 {
    39     int a,b;
    40     printf("Please Input Two Numbers:");
    41     scanf("a=%d,b=%d",&a,&b);
    42     printf("
    ");
    43     printf("Max Number is:");
    44     process(a,b,max);
    45     printf("Min Number is:");
    46     process(a,b,min);
    47     printf("The Sum is:");
    48     process(a,b,sum);
    49 }
    View Code
  • 相关阅读:
    ES分页
    在github上使用workflow构建docker镜像并推送阿里云
    xxl-job滥用netty导致的问题和解决方案
    使用netty实现socks5协议
    docker日志设置
    关于我
    友情链接
    分布式任务调度系统:xxl-job
    SpringBoot自定义配置以及IDEA配置提示
    frp穿透内网使用vsftpd服务
  • 原文地址:https://www.cnblogs.com/iambitiousman/p/3855963.html
Copyright © 2011-2022 走看看