C语言复习之结构体指针 ; 函数指针

结构体指针

不可以这样定义:
在这里插入图片描述
应该这样定义:加上指针,因为指针是4个字节,这样的话,他的大小就确定下来了。
在这里插入图片描述
在这里插入图片描述
一个是表示结构体,一个是表示结构体的指针。
在这里插入图片描述
很容易理解,脑子里要有内存图。
结构体也可定义为结构体数组: (结构体是我创建出来的数据类型 当然可以有数组)
在这里插入图片描述

函数指针

结构体中怎么放入函数中去?
在这里插入图片描述
怎么定义函数指针?
Int add ( int a , int b);
在这里插入图片描述
首先他是一个指针,那么在内存中必然有一块空间保存它。
在这里插入图片描述
在这里插入图片描述
这里仅仅针对函数可以有函数变量名 或者 ( &函数变量名)
结构体中调用函数指针。
在这里插入图片描述
改进程序:

Void draw_logo_lcda ( void) 
{
}
Void draw_logo_lcdb ( void) 
{
}
Typedef Struct  lcd_operation {Int type  ;Void  (* draw_logo_lcd) (void) 
}lcd_operation, *p_lcd_operation ;//架构体有数组    公司有两款LCD
Lcd_operation  xxx_com_lcds[] = {{ 0 ,   draw_logo_lcda} ,{ 1 ,   draw_logo_lcda} ,
};
Int  get_lcd_type(void)
{ }
p_lcd_operation  get_lcd (void) 
{Int type = get_lcd_type ();   //根据类型是什么  直接调用给类型实现的函数指针}
Int  main {Int type = get_lcd_type ();   //根据类型是什么  直接调用给类型实现的函数指针Xxx_com_lcds[type].draw_logo() ;   //调用结构体中 数组一类型的  的某一函数   } 

另一种实现:

Void draw_logo_lcda ( void) 
{
}
Void draw_logo_lcdb ( void) 
{
}
Typedef Struct  lcd_operation {
Int type  ;
Void  (* draw_logo_lcd) (void) 
}lcd_operation, *p_lcd_operation ;//架构体有数组    公司有两款LCD
Lcd_operation  xxx_com_lcds[] = {
{ 0 ,   draw_logo_lcda} ,
{ 1 ,   draw_logo_lcda} ,
};
Int  get_lcd_type(void)
{ }
//根据硬件的类型  直接返回一个结构体指针
p_lcd_operation  get_lcd (void)    //返回的直接是结构体指针 也就是return要加上地址
{Int  type = get_lcd_type ();   //根据类型是什么  直接调用给类型实现的函数指针   以后硬件类型变化了   只需要修改get_lcd_type (); Return   & Xxx_com_lcds[type] ;  //返回地址  只需要返回4字节的数据  返回结构体 会很多空间
}
Int  main {//  Int type = get_lcd_type ();   //根据类型是什么  直接调用给类型实现的函数指针//   Xxx_com_lcds[type].draw_logo() ;   //调用结构体中 数组一类型的  的某一函数   p_lcd_operation lcd ;Lcd = get_lcd ()  ;   //指针Lcd -> draw_logo() ;   } 

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/282806.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Yoast SEO Premium v21.7 Premium WordPress 插件Yoast +子插件介绍

什么是Yoast SEO? Yoast SEO 是 WordPress 的 SEO 插件,可帮助网站所有者针对搜索引擎优化他们的网站。该插件由 Joost de Valk 于 2008 年创建,旨在让每个人都能访问 SEO。今天,Yoast SEO 是全球数百万 WordPress 用户使用的最受…

目标跟踪 MOT数据集和可视化

目录 MOT15数据集格式简介 gt可视化 本人修改的GT可视化代码: MOT15数据集格式简介 以下内容转自:【目标跟踪】MOT数据集GroundTruth可视化-腾讯云开发者社区-腾讯云 MOT15数据集下载:https://pan.baidu.com/s/1foGrBXvsanW8BI4eybqfWg?…

数据结构之---- 分治算法

数据结构之---- 分治算法 什么是分治算法? 分治,全称分而治之,是一种非常重要且常见的算法策略。 分治通常基于递归实现,包括 分 和 治 两个步骤: 分(划分阶段):递归地将原问题分…

数据高可用架构设计与实现

大型企业如何实现 MySQL 到 Redis 的同步 前面曾提到过 Read/Write Through 和 Cache Aside 这几种更新缓存的模式或者说策略,这几种策略都存在缓存不命中的可能性,如果缓存没有命中,就需要直接访问数据库以获取数据。—般情况下&#xff0c…

Y4M视频文件格式

什么是Y4M 以YUV4Mpeg格式创建的视频文件;这个视频文件存储了一组未压缩的YCbCr图像,这些图像逐帧组成视频;在压缩成MPEG-2或Matroska等更流行的视频格式之前,用作原始的彩色视频格式 Y4M文件是一个纯文本格式的header开始,header有0或多个…

【经典LeetCode算法题目专栏分类】【第2期】组合与排列问题系列

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 组合总和1 class So…

linux笔记--VSCode利用交换机跳转服务器

目录 1--前言 2--VSCode设置 3--ssh连接 1--前言 博主学校的服务器有两个,其中一个服务器(14)可以通过挂内网VPN来进行连接,但另一个服务器(15)即使挂了VPN也不能连接,只能通过内网进行连接。…

Java入门学习笔记一

一、Java语言环境搭建 1、JAVA语言的跨平台原理 1.1、什么是跨平台性? 跨平台就是说,同一个软件可以在不同的操作系统(例如:Windows、Linux、mad)上执行,而不需要对软件做任务处理。即通过Java语言编写的…

Ansible-playbook编译.yml脚本

1、playbook是什么? 在Ansible中,Playbook是用于配置、部署和管理被控节点的剧本。它由一个或多个play(角色)组成,每个play可以包含多个task(台词,动作)。使用Ansible的Playbook&am…

轻量封装WebGPU渲染系统示例<52>- Json数据描述材质、纹理等3D渲染场景信息

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/DataDrivenScene3.ts 当前示例运行效果: ​​​​​​​ Json数据: {"renderer": {"mtplEnabled": true,"camera": {"eye&quo…

再怎么“顽固”的应用程序,也很难经得住以下的卸载方法

卸载程序是我们经常尝试的事情。这可能是因为我们不再需要程序,该程序可能会导致问题等。有时,如果你试图卸载某个程序,你会收到一个错误,但卸载没有发生。在这种情况下,你可以选择强制卸载。在本教程中,我将向你展示如何在Windows 10/11计算机上强制卸载程序。 ​控制面…

人工智能中的对比学习:算法原理与应用探索

导言 对比学习作为人工智能领域中的一种重要学习范式,在模型训练和应用中展现出独特的优势。然而,随着应用范围的扩大,对比学习也面临一些挑战。本文将深入探讨对比学习的算法原理、应用场景以及其在人工智能中的前景,并提出一些可…