#结构体、结构体指针和函数指针(韦东山C语言加强07)

1 结构体

//结构体及结构体指针
typedef struct student {char *name; int age;struct student *   classmate;
}student, * pstudent; int main( void )
{student zhangsan = {"zhangshan", 10, NULL};student lili = {"lili", 10, NULL};zhangsan.classmate = &lili;lili.classmate = &zhangsan;prvSetupHardware();printf("zhangsan's classmate is :%s\r\n", zhangsan.classmate->name);while (1);return 0;
}

2 函数指针在结构体中的妙用

typedef struct student {char *name;  int age;void (*good_work)(void); //函数指针struct student *   classmate;
}student, * pstudent; static void play_ball(void)
{printf("playing ball\r\n");
}static void sing_song(void)
{printf("singing\r\n");
}
int main( void )
{int i;student ss[2] = {{"zhangshan", 10, play_ball, NULL}, {"lili", 10, sing_song, NULL}};prvSetupHardware();for (i = 0; i < 2; i++){ss[i].good_work();}while (1);return 0;
}//---------------------------------------------------初级版-----------------------------------
#if 0
int main( void )
{int i;student ss[5] = {{"zhangshan", 10, NULL}, {"lili", 10, NULL}};prvSetupHardware();for (i = 0; i < 2; i++){if (strcmp(ss[i].name, "zhangshan") == 0)play_ball();else if (strcmp(ss[i].name, "lili") == 0)sing_song();}while (1);return 0;
}
#endif

3 EEPROM 与结构体指针的妙用

//通过eeprom读取lcd类型,执行相应操作
int read_eeprom()
{/* 0: lcd a* 1: lcd b*/return 0;
}int get_lcd_type(void)
{return read_eeprom();
}void draw_logo_lcda(void)
{printf("display logo on lcd a\r\n");
}void draw_logo_lcdb(void)
{printf("display logo on lcd b\r\n");
}struct lcd_ops {int type;void (*draw_logo)(void);void (*draw_text)(char *str);
};struct lcd_ops ask100_lcds[] ={{0, draw_logo_lcda, NULL},{1, draw_logo_lcdb, NULL},{2, draw_logo_lcdc, NULL},{3, draw_logo_lcdd, NULL},
};int main( void )
{int type = get_lcd_type();ask100_lcds[type ].draw_logo();prvSetupHardware();while (1);return 0;
}
//--------------------进阶——----减少全局变量的使用,如果使用,用函数封装起来-------------------int read_eeprom()
{/* 0: lcd a* 1: lcd b*/return 0;
}int get_lcd_type(void)
{return read_eeprom();
}void draw_logo_lcda(void)
{printf("display logo on lcd a\r\n");
}void draw_logo_lcdb(void)
{printf("display logo on lcd b\r\n");
}typedef struct lcd_operation {int type;void (*draw_logo)(void)
}lcd_operation, *p_lcd_operation;lcd_operation xxx_com_lcds[] = {{0, draw_logo_lcda},{1, draw_logo_lcdb},{2, draw_logo_lcdc},{3, draw_logo_lcdd},
};
//结构体指针
p_lcd_operation get_lcd(void)
{int type = get_lcd_type();return &xxx_com_lcds[type];
}int main( void )
{p_lcd_operation lcd;lcd = get_lcd();//获取lcdlcd->draw_logo();prvSetupHardware();while (1);return 0;
}

4 ARM架构(韦东山)

int main( void )
{volatile int a = 1;volatile int b = 2;a = a + b;prvSetupHardware();printf("a = %d\r\n", a);while (1);return 0;
}

一些汇编指令



5 链表

链表基础

typedef struct spy {char *name;struct spy *next;
}spy, *p_spy;spy A = {"A", NULL};
spy B = {"B", NULL};
spy C = {"C", NULL};int main( void )
{p_spy head = NULL;A.next = &B;B.next = &C;C.next = NULL;prvSetupHardware();head = &A;while (head){printf("%s\r\n", head->name);head = head->next;}while (1);return 0;
}

插入

void insert_spy(p_spy newspy)
{p_spy last;if (head == NULL){head = newspy;newspy->next = NULL;}else{/* 先找到链表的最后一项 last */last = head;while (last){if (last->next == NULL) /* 找到了 */break;elselast = last->next;}/*  */last->next = newspy;newspy->next = NULL;}
}int main( void )
{/*  A.next = &B;B.next = &C;C.next = NULL;
*/insert_spy(&A);   insert_spy(&B); insert_spy(&C); insert_spy(&D); prvSetupHardware();head = &A;while (head){printf("%s\r\n", head->name);head = head->next;}while (1);return 0;
}

删除

void remove_spy(p_spy oldspy)
{p_spy left;if (head == oldspy){head = oldspy->next;}else{/* 找出oldspy的上线 */left = head;while (left){if (left->next == oldspy)break;elseleft = left->next;}if (left){left->next = oldspy->next;}}
}

韦东山C语言加强07相关推荐

  1. 韦东山C语言加强课,截图+代码+学习笔记【2000字】【原创】

    文章目录

  2. 韦东山—C++快速入门—导航

    时间 :2022年9月2日 15点07分 笔记 : chenxu 教程 :韦东山C++语言教程 ==================================================== ...

  3. 【深度】韦东山:一文看尽 linux对中断处理的前世今生

    作者:韦东山 前言: 本文,4200字,研究代码花了一天,写出来花了一天: 录视频估计又得花半天: 真怀念以前简单粗暴的生活啊: 拿起话筒就录视频, 先画好图?那是不需要的 文档?那是不存在的 真是洒 ...

  4. 韦东山第一二期衔接课程内容概要

    韦东山第一二期衔接课程内容概要 0 使得一个裸板Jz2440能运行linux应用程序的过程 1 uboot启动内核总结 1.1 u-boot分析之编译体验 1.2 u-boot分析之Makefile结 ...

  5. 韦东山第1期-学习笔记-3

    韦东山第1期视频-第9课.知识点简单,仅用于回顾.弱点补充.注意Makefile变量.函数的使用,要会分析.更改Makefile. 课表: 1.C语言指针相关 二.Makefile

  6. 作为一个新人,怎样学习嵌入式Linux ?(韦东山)

    作为一个新人,怎样学习嵌入式Linux ?(韦东山) 被问过太多次,特写这篇文章来回答一下.    在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看 ...

  7. 002_韦东山嵌入式Linux应用开发基础_实操碰到的问题集锦

    嵌入式Linux应用开发基础_韦东山教程思考笔记 配合<嵌入式Linux应用开发完全手册V5.1_IMX6ULL_Pro开发板> 文件目录 访问根/目录下,Filesystem Root目 ...

  8. 【深度】韦东山:一文看看尽linux对中断处理的前世今生

    作者:韦东山 原文链接:https://blog.csdn.net/thisway_diy/article/details/104848034 前言: 本文,4200字,研究代码花了一天,写出来花了一 ...

  9. 韦东山:机会总是留给有准备的人

    最近电子发烧友(以下称'发烧友')采访了韦东山老师,本文是采访原稿,展示出来让大家更深入了解韦老师的同时也进一步学习嵌入式Linux经验. 机会总是留给有准备的人 发烧友: 为什么要学习掌握ARM裸机 ...

最新文章

  1. C++:随笔9----模板/内联函数/容器
  2. Webview--如何让加载进来的页面自适应手机屏幕分辨率居中显示
  3. 实现一个EventTarget类
  4. Vue 3 都 RC 了,前端的你还不来看看
  5. JavaScript字符串操作方法大全,包含ES6方法 1
  6. WP7 开发(十五)输入范围和文本框
  7. 构建自己的PHP框架--构建缓存组件(2)
  8. php 流量,PHP 流量控制语句的顶替语法
  9. React学习笔记:入门案例
  10. 一dubbo框架学前原理介绍
  11. 时域离散信号/系统频域分析(matlab)零点,极点,因果,稳定
  12. 深度学习语音识别方法概述与分析
  13. 常见的网络摄像机方案
  14. java流重定向如何分类,Java 文件流与标准流之间的重定向
  15. 计算机协会素拓小游戏,素拓游戏策划书-20210418231500.doc-原创力文档
  16. 将旧电脑配置成linux主机,如何将旧电脑变成主文件服务器
  17. 【VUE】vue3学习笔记(异步组件,包含defineAsyncComponent、Suspense的使用)
  18. yolov2 损失函数_深度学习计算机视觉之YOLO,YOLOv2和YOLOv3算法(超详细解析)
  19. 国产热门操作系统Deepin试用感受
  20. 【Linux指令②】新手必须掌握的Linux指令

热门文章

  1. Windows下如何配置tomcat环境变量
  2. Redis Java连接使用
  3. java计算机毕业设计在线影视系统源码+数据库+lw文档+系统+部署
  4. java毕业设计物资租赁管理系统mybatis+源码+调试部署+系统+数据库+lw
  5. golang 字符串拼接性能比较
  6. 不用标点符号实现加减乘除运算
  7. Python统计序列或文件中元素的频度
  8. 971. 翻转二叉树以匹配先序遍历
  9. 某班有5名同学,建立一个学生的简单信息表,包括学号、姓名、3门课程的成绩,编写程序,计算每名学生的平均成绩及名次。(30分) 题目内容: 某班有5名同学,建立一个学生的简单信息表,包括学号、姓名、3
  10. Shell脚本有什么用