• 【C++】函数指针 ③ ( 函数指针语法 | 函数名直接调用函数 | 定义函数指针变量 | 使用 typedef 定义函数类型 | 使用 typedef 定义函数指针类型 )







    一、函数指针语法




    1、函数名直接调用函数


    定义一个函数 , 如下 函数的类型是 int(int, int) ;

    int add(int x, int y) {
    	printf("x + y = %d\n", x + y);
    	return x + y;
    }
    
    • 1
    • 2
    • 3
    • 4

    直接调用函数 : 该函数的 函数名 add 就是 函数地址 , 直接调用 add 函数 , 运行该函数 ;

    	// 1. 直接调用
    	// 直接调用 add 函数 , 运行该函数
    	// 函数名 add 就是函数地址
    	add(1, 2);
    
    • 1
    • 2
    • 3
    • 4

    2、定义函数指针变量


    如果不使用 add 函数名 调用函数 , 使用 函数类型的指针 也可以 调用函数 ;

    函数 int add(int x, int y) 的 类型是 int(int, int) , 函数类型只需要注明函数的 返回值 和 参数列表 类型即可 ;

    直接定义 int(int, int) 函数类型 的指针 , 将 add 函数名 ( 函数地址 ) 直接 赋值给 函数指针 , 可以直接通过函数指针调用函数 ;

    下面的代码中 , 定义了函数指针 p , 指向 int(int, int) 类型的函数 , 将 add 函数地址 赋值给 函数指针 p , 之后通过 函数指针 p 调用 add 函数 ;

    代码如下 :

    	// 声明一个 int(int, int) 类型的指针变量
    	// int(int, int) 类型 是 函数类型 
    	// 该指针 指向 函数地址
    	int(*p)(int, int) = add;
    	// 通过函数指针调用 函数
    	p(3, 4);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3、使用 typedef 定义函数类型


    定义函数类型 语法格式如下 :

    typedef returntype newfunname(parameterlist)
    
    • 1
    • typedef 是 类型重命名 关键字 ;
    • returntype 是 函数返回值类型 ;
    • newfunname 是 定义的函数类型名称 ;
    • parameterlist 是 函数的参数列表 ;

    定义函数类型示例 :int add(int x, int y) 函数的 函数类型 int (int, int) , 定义为 func_add 名称 , 使用时需要使用该类型的指针调用函数 , 也就是 func_add* 类型 ;

    // int (int, int) 函数类型重命名为 func_add
    // 使用时需要使用该类型的指针调用函数
    typedef int fun_add(int, int);
    
    • 1
    • 2
    • 3

    使用定义的 函数类型 调用函数 : 定义函数类型 的 指针类型 func_add* 变量 , 然后 将 add 函数地址 赋值给 该指针变量 , 然后 通过 函数指针变量 调用该函数 ;

    	// 定义函数指针类型变量
    	fun_add* fun = add;
    	fun(5, 6);
    
    • 1
    • 2
    • 3

    4、使用 typedef 定义函数指针类型


    定义函数指针类型 语法格式如下 :

    typedef returntype (*newfunname)(parameterlist)
    
    • 1
    • typedef 是 类型重命名 关键字 ;
    • returntype 是 函数返回值类型 ;
    • * 表示 定义的是 指针类型 , 指向函数地址 ;
    • newfunname 是 定义的函数类型名称 ;
    • parameterlist 是 函数的参数列表 ;

    定义函数类型示例 : 将指向 int add(int x, int y) 函数的 函数指针类型 int (*)(int, int) , 定义为 pFun_add名称 , 使用时需要使用该类型变量调用函数 , 也就是 pFun_add 类型 ;

    // int (int, int) 函数指针类型重命名为 pFun_add
    // 该类型变量可以直接接收 函数名 ( 函数地址 )
    typedef int (*pFun_add)(int, int);
    
    • 1
    • 2
    • 3

    使用定义的 函数指针类型 调用函数 : 定义函数指针类型 pFun_add 的 变量 , 然后 将 add 函数地址 赋值给 该变量 , 然后 通过 函数指针变量 调用该函数 ;

    	// 定义函数指针类型变量
    	pFun_add pFun = add;
    	fun(7, 8);
    
    • 1
    • 2
    • 3




    二、完整代码示例



    代码示例 :

    #include "iostream"
    using namespace std; 
    
    // int (int, int) 函数类型重命名为 func_add
    // 使用时需要使用该类型的指针调用函数
    typedef int fun_add(int, int);
    
    // int (int, int) 函数指针类型重命名为 pFun_add
    // 该类型变量可以直接接收 函数名 ( 函数地址 )
    typedef int (*pFun_add)(int, int);
    
    int add(int x, int y) {
    	printf("x + y = %d\n", x + y);
    	return x + y;
    }
    
    int main() {
    
    	// 1. 直接调用
    	// 直接调用 add 函数 , 运行该函数
    	// 函数名 add 就是函数地址
    	add(1, 2);
    
    	// 声明一个 int(int, int) 类型的指针变量
    	// int(int, int) 类型 是 函数类型 
    	// 该指针 指向 函数地址
    	int(*p)(int, int) = add;
    	// 通过函数指针调用 函数
    	p(3, 4);
    
    	// 定义函数指针类型变量
    	fun_add* fun = add;
    	fun(5, 6);
    
    	// 定义函数指针类型变量
    	pFun_add pFun = add;
    	fun(7, 8);
    
    	// 控制台暂停 , 按任意键继续向后执行
    	system("pause");
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    执行结果 :

    x + y = 3
    x + y = 7
    x + y = 11
    x + y = 15
    Press any key to continue . . .
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

  • 相关阅读:
    炫酷转换:Java实现Excel转换为图片的方法
    为什么 Elasticsearch 中高基数字段上的聚合是一个坏主意以及如何优化它
    Qt QSS中 background-image,border-image,以及image属性差别
    抓取手机端变体组合思路设想
    WPS(WSC)中M1 到M8 图解
    【AHK】不常用操作备份笔记
    京东双11商品标题怎么写?教你打造优质标题
    java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统
    k8s--基础--22.9--storageclass--类型--Quobyte
    Springboot整合Websocket(推送消息通知)
  • 原文地址:https://blog.csdn.net/han1202012/article/details/134368901