当前位置: 首页 > wzjs >正文

腾讯云 网站备案网站定制项目

腾讯云 网站备案,网站定制项目,怎样查看别人网站流量,房产门户网站平台搭建目录 1.1 函数指针的概念和应用 1.2 赋值与内存模型 1.3 调用方式与注意事项 二、函数指针的使用 2.1 函数指针的定义和访问 2.2 动态调度:用户输入驱动函数执行 2.3 函数指针数组进阶应用 2.4 函数作为参数的高阶抽象 三、回调函数 3.1 指针函数…

目录

1.1  函数指针的概念和应用

1.2  赋值与内存模型

1.3  调用方式与注意事项

二、函数指针的使用

2.1  函数指针的定义和访问

2.2  动态调度:用户输入驱动函数执行

2.3  函数指针数组进阶应用

2.4  函数作为参数的高阶抽象

三、回调函数

3.1  指针函数vs函数指针

3.2  指针函数应用

3.3  回调函数机制解析

3.4  消息循环


函数指针是C语言中指向函数的指针变量,其本质是存储函数入口地址的指针。与普通指针不同,函数指针指向的是代码段中的可执行指令,而非数据存储区域。

1.1  函数指针的概念和应用

·核心概念

函数指针的类型由函数的返回值类型和参数列表共同决定。

例如:

input (*ptr)(int, char) 

表示ptr是一个指向返回值为int、参数为 (int, char) 的函数的指针。

·应用

  • 动态函数调用:根据运行时条件选择执行不同函数
  • 回调机制:实现框架与业务代码的解耦
  • 算法通用化:如自定义排序函数的比较逻辑

1.2  赋值与内存模型

  • 示例
int add(int a, int b){ return a+b; } //两数之和
int sub(int a, int b){ return a-b; } //两数之差
  • 函数指针赋值 
//函数指针赋值
int (*ptr)(int, int) = add; //直接赋值函数名(隐式取地址)
ptr = ⊂ //显式取地址(等价于sub)

·内存本质:函数指针存储的是函数在内存中的起始地址(add与&add等价),该地址指向函数的机器码起始位置。 

1.3  调用方式与注意事项

int result1 = ptr(3,5);
int result2 = (*ptr)(3,5);

⚠️注意事项 

  • 调用前必须确保指针已正确指向有效函数
  • 参数类型、个数与指针声明完全匹配
  • 避免指向局部函数或已释放的函数(如动态链接库卸载后的函数)

二、函数指针的使用

2.1  函数指针的定义和访问

//使用typedef简化声明
typedef int (*Func)(int, int);Func ad = add; //定义简洁
int res = ad(10,20);

·类型别名优势:

  •  代码可读性提高,明确指针用途
  • 批量修改函数签名时只需要修改一处

2.2  动态调度:用户输入驱动函数执行

·头文件

#include <stdio.h>

·定义add和sub

int add(int a,int b) { return a+b; }
int sub(int a,int b) { return a-b; }

·主函数

int main() {int x,y,choice;typedef int (*Func)(int, int);Func ads[] = {add, sub};printf("选择(0:加,1:减): ");scanf("%d",&choice);printf("输入两个数: ");scanf("%d%d",&x,&y);int result = ads[choice](x,y); // 动态调用printf("结果: %d\n",result);return 0;
}

⬇️

执行逻辑:

通过数组下标映射用户输入,实现低成本的多函数调度方案 

2.3  函数指针数组进阶应用

typedef int(*MathFunc)(int, int);MathFunc funcs[] = {add,  // 0:加法sub,  // 1:减法mul,  // 2:乘法div   // 3:除法
};//动态调用示例
int result = funs[choice](a,b);

· 优势场景 

当需要管理大量函数时,数组索引可提供O(1) 时间复杂度的快速访问。

2.4  函数作为参数的高阶抽象

// 通用排序函数(接收比较函数作为参数)
void sort(int arr[], int len, int (*cmp)(int, int)) {// 冒泡排序实现for (int i=0; i<len-1; i++) {for (int j=0; j<len-i-1; j++) {if (cmp(arr[j], arr[j+1]) > 0) {// 交换元素}}}
}// 升序比较函数
int cmp_asc(int a, int b) { return a - b; }// 降序比较函数
int cmp_desc(int a, int b) { return b - a; }// 使用示例
sort(arr, 10, cmp_asc); // 升序排序
sort(arr, 10, cmp_desc); // 降序排序

三、回调函数

3.1  指针函数vs函数指针

类型定义语法本质
指针函数int* func(int a)返回指针的函数
函数指针int(*func)(int a)指向函数的指针变量

3.2  指针函数应用

// 返回动态分配数组的指针函数
int* create_arr(int size) {int* arr = (int*)malloc(size * sizeof(int));// 初始化数组return arr;
}

3.3  回调函数机制解析

回调函数是通过函数指针实现的一种双向通信机制:

  1. 调用方定义函数原型并预留指针函数
  2. 被调用方(如库函数)在特定事件发生时调用该指针
// 模拟操作系统定时器回调
typedef void (*Callback)(int data);void set_timer(int ms, Callback cb) {// 模拟定时器逻辑while (ms > 0) { /* 延时 */ }cb(42); // 时间到达时触发回调
}// 用户自定义回调函数
void on_timer(int data) {printf("定时器触发,数据: %d\n", data);
}// 使用示例
set_timer(1000, on_timer); // 注册回调函数

3.4  消息循环

// 简化的GUI消息循环
typedef void (*MsgHandler)(int msg, void* data);void message_loop(MsgHandler handler) {while (1) {int msg = get_next_message(); // 获取消息void* data = get_message_data(msg);handler(msg, data); // 分发消息到回调函数}
}// 用户注册消息处理函数
void handle_msg(int msg, void* data) {switch (msg) {case WM_CLICK:   process_click(data); break;case WM_KEYDOWN: process_keypress(data); break;}
}// 启动消息循环
message_loop(handle_msg);

🌟个人主页🌟

👾C语言学习合集(草稿版)👾


文章转载自:

http://W8QrRc6N.tnjff.cn
http://dXxiGcym.tnjff.cn
http://cFZ2KNPS.tnjff.cn
http://643XfXl3.tnjff.cn
http://i5c4rycQ.tnjff.cn
http://DCyk0pME.tnjff.cn
http://kpMSMxuI.tnjff.cn
http://PWd5WHO2.tnjff.cn
http://LqMC1GmP.tnjff.cn
http://TmRoOY8d.tnjff.cn
http://Z0yplJOI.tnjff.cn
http://ou2dojLx.tnjff.cn
http://olxjXEEK.tnjff.cn
http://2DLnqj2z.tnjff.cn
http://V4BXO2Jj.tnjff.cn
http://PLodmODF.tnjff.cn
http://h8o0RGK9.tnjff.cn
http://9imWDHTG.tnjff.cn
http://FZ8pfMHJ.tnjff.cn
http://wZWikPnZ.tnjff.cn
http://Ie2FYf8w.tnjff.cn
http://VSeib420.tnjff.cn
http://nc2wMf7Q.tnjff.cn
http://sN9IZdpN.tnjff.cn
http://uOuFZDiz.tnjff.cn
http://rnQ8xjsJ.tnjff.cn
http://9cWoev6o.tnjff.cn
http://EwH1ul1L.tnjff.cn
http://cq2WYSC5.tnjff.cn
http://PSHa93qX.tnjff.cn
http://www.dtcms.com/wzjs/659080.html

相关文章:

  • 好用的a站网站设计哪家比较好
  • 美食类网站开发需求沈阳网站seo优化哪家好
  • 杭州企业网站seo网站建设备案策划书
  • 北京网站建设有哪些智能模板网站建设方案
  • 网站做打火机如何免费玩游戏
  • 南昌企业制作网站设计如何查询公司做没做网站
  • 郑州网站推广方法朋友圈的广告推广怎么弄
  • 网站建设指导方案做网站还要维护吗
  • 十堰学网站建设培训班怎么在百度上做广告
  • 英语培训网站源码代理网址在线
  • 哪些网站平台可以做推广做个个人网站要怎么做
  • 做暖暖视频免费观看免费网站蛋糕店的网站建设咋写
  • 网站管理员容易做吗计算机专业网站设计论文
  • 网站开发都用什么浏览器防wordpress花园
  • 最全的游戏网站电商网站建设可行性分析
  • 网站维护一般多久找人开发一个app多少钱
  • 大连网站优化多少钱网站上传 文件夹结构
  • 翔安区建设网站网站建设必备的功能模块
  • 成都手机号码网站建设网站建设一级页面二级页面
  • 想建设个人网站去那里建设腾讯云建设网站视频
  • 网站建设和使用情况网站生成app工具
  • 河南省建设协会网站嘉兴网站排名优化报
  • 做网站推广如何茶山东莞网站建设
  • 姑苏区网站建设大连城市建设集团网站
  • 微信公众号怎么创建第二个百度关键词优化怎么做
  • 校园门户网站建设公司做网站有效果吗
  • 网站建设shwzzz华为手机网络推广方案
  • 找工程分包网站免费微信公众号素材网
  • 济南网站建设报价家在深圳光明业主论坛
  • 个人备案网站做淘宝客可以用吗充电宝网站建设策划书