博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习函数指针的笔记
阅读量:6623 次
发布时间:2019-06-25

本文共 2112 字,大约阅读时间需要 7 分钟。

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\n", 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\n", func_ptr(i, k));58     printf("%d\n", my_sum_ptr(i, k));59     printf("%d\n", result_ptr(i, k));60     printf("%d\n", 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 }

 

转载于:https://www.cnblogs.com/zanzan101/p/3326542.html

你可能感兴趣的文章
iphone http下载文件
查看>>
poj 1195:Mobile phones(二维树状数组,矩阵求和)
查看>>
Codeforces 433 C. Ryouko's Memory Note
查看>>
java中的Static class
查看>>
实例讲解Linux下的makefile
查看>>
json lib 2.4及其依赖包下载
查看>>
计算机中文核心期刊
查看>>
sql的left join 命令
查看>>
8148 8168 中移植live55 出现except rtsp 中途莫名的断流
查看>>
【BZOJ】3832: [Poi2014]Rally
查看>>
[转]看懂ExtJS的API
查看>>
宜昌民生大厦
查看>>
推荐15款制作 SVG 动画的 JavaScript 库
查看>>
转:OpenResty最佳实践(推荐了解lua语法)
查看>>
转:CEO, CFO, CIO, CTO, CSO是什么
查看>>
ROC曲线(receiver-operating-characteristic curve)-阈值评价标准(转)
查看>>
Swift 表达式
查看>>
FFmpeg(8)-打开音视频解码器,配置解码器上下文(avcodec_find_decoder()、avcodec_alloc_context3())...
查看>>
andriod自定义视图
查看>>
linux下vim更改注释颜色
查看>>