2026/1/19 2:39:29
网站建设
项目流程
泰达建设集团网站,温州网页设计哪家好,电子网站,网站设计与网页制作模板顾名思义#xff0c;所谓的指针函数#xff0c;也就是函数返回值类型为指针类型#xff08;返回地址#xff09;的函数#xff0c;函数格式差不多就是下面这个造型#xff1a;数据类型 *函数名(形参1, …, 形参n );或者更直观更易看懂的造型#xff1a;(数据类型 *) 函数…顾名思义所谓的指针函数也就是函数返回值类型为指针类型返回地址的函数函数格式差不多就是下面这个造型数据类型 *函数名(形参1, …, 形参n );或者更直观更易看懂的造型(数据类型 *) 函数名(形参1, …, 形参n );其中数据类型可以为基本数据类型整型浮点型等如下声明一个返回整型指针的指针函数复制int*add(inta,intb); 或者(int*)add(inta,intb);也可以为复合数据类型最常用的应该就是结构体类型如下声明一个返回结构体指针的指针函数复制ST_DEVICE_STATUS*get_device_status(void); 或者(ST_DEVICE_STATUS*) get_device_status(void);其中ST_DEVICE_STATUS为结构体类型。那究竟指针函数有哪些应用呢指针函数一般可以用来返回字符串和全局变量地址或者返回结构体指针等。1、返回字符串和全局变量地址可以直接返回字符串常量的地址复制char*getMessage(void){returnHello World;// 字符串常量存储在静态区}可以直接返回全局变量的地址复制intg_Value;int*getValue(void){returng_Value;}上面为什么强调说是返回全局变量的地址呢局部变量不行吗是的不能通过上面的方式返回局部变量的地址因为局部变量在函数结束的时候其生命周期也跟着结束了返回的局部变量指针会变成所谓的悬垂指针Dangling Pointer此时你可能会正常读取到局部变量的值但这并不代表代码正确也可能会读取到垃圾值甚至是程序崩溃即所谓的未定义行为我们来实际测试看下结果复制int*getValue(void){intl_value 100;//定义一个局部变量并初始化为100returnl_value;//尝试返回局部变量的地址}程序编译无错误但直接来一条警告信息说明这种操作就存在风险了所以说程序编译时我们也需要关注一下警告信息不能只关注错误信息。至于程序运行结果是不是100咱们就不看了。2、返回结构体指针返回结构体指针其实也是指针函数的很常见的应用它可以以一个简单操作对全局结构体变量的数据进行读写操作非常方便并且避免了直接暴露全局结构体变量到程序代码中。我们来看下代码复制//定义一个结构体记录和更新设备相关的状态信息typedefstruct{uint8_tdevice_status_error;uint8_tdevice_status_alarm;uint8_tdevice_status_warning;} ST_DEVICE_STATUS;//定义一个全局结构体变量记录设备状态信息ST_DEVICE_STATUS g_stDeviceStatus;//定义一个指针函数返回设备状态结构体指针数据(ST_DEVICE_STATUS *) getDeviceStatus(void){returng_stDeviceStatus;}//使用指针函数voidfunc(void){ST_DEVICE_STATUS *pDeviceStatus;pDeviceStatus getDeviceStatus();//读设备状态读操作相当于直接读全局变量g_stDeviceStatusif(pDeviceStatus- device_status_error){}elseiif(pDeviceStatus- device_status_alarm){}//清除设备状态写操作相当于直接写全局变量g_stDeviceStatuspDeviceStatus- device_status_error 0pDeviceStatus- device_status_alarm 0}以上的代码通过指针函数的方式封装了全局结构体变量除了指针函数里直接操作了全局变量其余代码完全不需要直接操作全局变量不仅方便读写也增强了代码的可维护性和可读性。再给大家看下作者开发的实际项目代码另外还可以用来创建链表节点看下面代码复制//定义一个指针函数创建链表节点structNode* createNode(intdata){structNode* node (structNode*)malloc(sizeof(structNode)); node-data data;returnnode;// 返回结构体指针}但是使用指针函数时也需要注意以下几点1、如前文所述一定要注意不要试图返回一个局部变量的地址2、函数返回值的类型和定义的类型一定要匹配3、要注意区分指针函数和函数指针后续文章会介绍函数指针以下的对比基本上就可以看出两者的区别名称基本格式描述原因指针函数int * func(int a, int b) 或者int *func(int a, int b)本质是一个函数返回指针的函数括号优先级大于*func会先与右边结合构成一个func函数函数指针int (*func)(int a, int b)本质是一个指针指向函数的指针*func是一个整体指向int (int a, int b)函数的一个指针---------------------作者dffzh链接https://bbs.21ic.com/forum.php?modviewthreadtid3461016来源21ic.com此文章已获得原创/原创奖标签著作权归21ic所有任何人未经允许禁止转载。