zoukankan      html  css  js  c++  java
  • 学习函数指针的笔记

     1 int my_sum_func(int i, int k)
     2 {
     3     return i+k;
     4 }
     5 // 定义函数指针的两种方式
     6 
     7 // 第一种:声明一个函数指针变量
     8 int (*func_ptr)(int, int);
     9 // (int(*)(int, int)) func_ptr; 这种声明方式不合法
    10 // 函数指针书写的几个要点:
    11 // 1 标识符前面加*
    12 // 2 (*标识符)(参数列表)
    13 // 3 最前面是返回值类型
    14 
    15 // 第二种:定义一个函数指针类型,再用这个类型去声明一个变量,本质上还是声明一个函数指针变量
    16 typedef int (*my_sum_func_ptr)(int, int);
    17 my_sum_func_ptr my_sum_ptr;
    18 // typedef (int(*)(int, int)) my_sum_func_ptr; 这种声明方式不合法
    19 
    20 // 扩展:如何返回函数指针
    21 void* get_func_ptr(int (*func)(int,int))
    22 {
    23     return func;
    24 }
    25 /*
    26 这种书写方式不合法,返回函数指针的时候,只能通过 void* 转换
    27 
    28 ((int*)(int,int)) get_func_ptr(int (*func)(int, int))
    29 {
    30     return func;
    31 }
    32 */
    33 
    34 void my_print_func(char* str)
    35 {
    36     printf("%s
    ", str);
    37 }
    38 
    39 int main(int argc, char* argv[])
    40 {
    41     func_ptr = &my_sum_func;                                    // 对函数指针变量赋值
    42     my_sum_ptr = &my_sum_func;                                    // 对函数指针变量赋值
    43     int (*result_ptr)(int,int);
    44     result_ptr = (int(*)(int, int))get_func_ptr(func_ptr);        // 注意:此处的类型转换一个括号也不能落下
    45                                                                 // 即:(int(*)(int,int)) 少一层括号就不对
    46     //函数数组
    47     my_sum_func_ptr func_ptr_array[2];
    48     func_ptr_array[0] = &my_sum_func;
    49     /*
    50     这种书写方式不合法,需要先转换类型:
    51 
    52     func_ptr_array[1] = (int(*)(int, int))&my_print_func; 
    53     */
    54     func_ptr_array[1] = (int(*)(int, int))&my_print_func;
    55     int i = 2;
    56     int k = 3;
    57     printf("%d
    ", func_ptr(i, k));
    58     printf("%d
    ", my_sum_ptr(i, k));
    59     printf("%d
    ", result_ptr(i, k));
    60     printf("%d
    ", func_ptr_array[0](i, k));
    61     /*
    62     当使用错误的函数指针调用函数时,会出现运行时错误:
    63     例如:
    64     func_ptr_array[0] = (int(*)(int, int))&my_print_func;
    65     func_ptr_array[0](i, k)); //这一句话会产生运行时错误
    66     */
    67 
    68     char* str = "Hello World !";
    69 
    70     void (*my_print_ptr)(char* str);
    71     my_print_ptr = &my_print_func;
    72     my_print_ptr(str);
    73     my_print_ptr = (void(*)(char*))func_ptr_array[1];            //这里需要再转换回来
    74     my_print_ptr(str);
    75 
    76 
    77     getchar();
    78     return 0;
    79 }
  • 相关阅读:
    一条语句批量插入多条数据
    VMware Workstation 15 Pro 永久激活密钥
    windows下java项目打包、启动批处理 .bat文件
    java简写名词解释
    windows查看所有进程:netstat -ano
    Java验证jwt token
    【转载】三种方法从 HTTPS 网站导出 SSL 证书链
    使用solr将CSV/XML/DB/JSON数据发布为Rest Service
    检验多个xsd的xml是否合法
    Eclipse 打包运行maven项目
  • 原文地址:https://www.cnblogs.com/zanzan101/p/3326542.html
Copyright © 2011-2022 走看看