给嵌入式新人的几条建议(共勉):三-C语言基础怎么补?
- 前言
- 1、先回答一个问题,对C语言的害怕到底在哪?(纠正认知)
- 2、C语言基础,要补全部吗?No
- 2.1 先看下自己属于哪种情况?
- 2.2 回答1个问题,C语言有什么?
- 2.2.1 数据类型
- 2.2.2 分支结构
- 2.2.3 函数
- 2.2.4作用域
- 2.2.5 关键字
- 2.3 有没有动手写代码?
- 2.4 战线拉了多久?
- 2.5 搭建环境很苦恼?
- 3、总结:
- 本系列回顾清单
前言
嵌入式技术涉及的内容十分广泛。不慌,看完Eric-xuan这个新人系列,不说游刃有余,至少可以自己教自己。 这一篇我们讲:嵌入式开发之-C语言基础1、先回答一个问题,对C语言的害怕到底在哪?(纠正认知)
C语言难的是程序设计思路,不是C语言本身。
不管是学生还是职场新人,有很多人在看到复杂的C语言代码时,望而却步。心中对他竖起了高墙,这是给自己的高墙。
那么为什么呢?没有沉下来去面对。
停留在“小马过河”故事中,认知来自其他人的一些结论中。
我曾经不止一次的听到有人说,“你们做C语言开发啊,那你们很厉害,C语言做底层很难。”
说这话的人多少有点不负责了,也高低有点片面了。
C语言确实可以做很多复杂高效的设计,但是难在设计思想,而不是C语言本身,任何一门编程语言,难的都不是语言本身,而所谓的难的实现,也都离不开每一门编程语言的基础。
所以要搞清楚,自己害怕的是C语言还是由他的基础衍生出来的内容。
举个例子:曾遇到有人说“指针好复杂,链表好复杂,这些内容感觉好难理解”。
这里就是没有搞清楚,指针和链表的关系。按照下面的思路:
(1)指针是什么? 指针就是一个变量,这个变量专门存其他变量的地址。 这里的其他变量可以是变量、数组、函数、结构体等,这些可以暂时不去深入。
(2)链表是什么?链表就是包含了指针和数据在内的一个带节点的数据结构,其中的指针可以指向另一个和这个结点一样的结构体类型。那我们可以自己定义这么一个结构体变量(因为结构体变量可以包含不同类型的变量),如下:
// 定义单链表的节点结构体
typedef struct Node {int data; // 数据域struct Node* next; // 指针域,指向下一个节点
} Node;
有了结点,就可以初始化,就像给一个变量赋值,只不过这次是给1个结构体赋值,要做的事情就是:
(1)创建一个这样的结点,赋初始值;
(2)形成链表(创建另一个结点,让之前创建的结点中的指针,指向新创建的结点),
如下:
// 创建一个新的节点
Node* createNode(int data) {Node* newNode = (Node*)malloc(sizeof(Node)); // 分配内存if (newNode == NULL) {printf("内存分配失败\n");exit(0);}newNode->data = data; // 设置数据域newNode->next = NULL; // 下一个节点指针设为NULLreturn newNode;
}
// 在链表末尾添加一个新节点
void appendNode(Node** head, int data) {Node* newNode = createNode(data);if (*head == NULL) { // 如果链表为空,新节点即为头节点*head = newNode;return;}Node* current = *head;while (current->next != NULL) { // 遍历到链表末尾current = current->next;}current->next = newNode; // 在末尾添加新节点
}
到此,这个链表或者说一个新的结构体,就定义完成了,并且可以使用它来做一些事情了。
这里涉及到的C语言的东西:
(1)变量: int data
(2)结构体指针:Node *next
(3)结构体定义:typedef struct Node{ int data; Node *next }Node;
2、C语言基础,要补全部吗?No
2.1 先看下自己属于哪种情况?
(1)对C语言有什么,不清楚,看代码时总是拿不准。
(2)掌握一定的C语言基础,对于复杂的数据类型及特殊的用法不清楚。
但是都可以做同一件事:梳理一下C语言基础的知识脉络
2.2 回答1个问题,C语言有什么?
2.2.1 数据类型
(1)基本数据类型: 整形(int),字符型(char),浮点型(float &double);
(2)枚举类型: enum, 赋值整形数
(3)void类型:修饰输入输出参数时表示无参数,修实指针时表示万能类型
(4)派生类型:数组 array[ ],指针 *p,结构体类型,联合体类型,位域。
其中数组用来表示连续的相同数据类型的存储;
指针是存储地址的;
结构体可以包含不同的数据类型,在嵌入式应用中,通常要注意结构体字节对齐。
2.2.2 分支结构
(1)顺序
(2)判断
- if ... else... , if ...else if... else... - 嵌套if ... else... , if...else if... else... - switch ...case ... - 嵌套 switch ... case...
(3)循环(for, do…while, while)
2.2.3 函数
(1)输入参数、返回参数
(2)函数声明
2.2.4作用域
变量函数的作用域,是否被头文件,或者extern 关键字扩大了。
2.2.5 关键字
以上我只是列举了常用到的一些基础,如果这些都不会,那么在看代码时可想而知是多么有阻力。
根据自己的个人情况,有的放矢的学习。
2.3 有没有动手写代码?
很多新人,可能在应聘结束后,1年都没怎么写过代码了,这不是夸张。
实践性这么强的编程,不写代码,真的能都理解吗?我打个问号。
重在实践,所谓“看会”并不是真会,要在实践中检验自己。
2.4 战线拉了多久?
很多初学者或者补基础的朋友,总是觉得C语言基础补一遍内容很多。
其实,内容并不多,完全可以在1-2天,甚至1周内,完成一遍。
战线拉的越久,也就越容易懈怠。
我曾在深圳实习时,用1周的下班时间过了1遍C,我属于不怎么聪明的人,按照我的标准,如果你完不成,我觉得那要么就是真的有什么重要的时间错不开,要么就是个人的态度问题,这个就得好好反思一下。
2.5 搭建环境很苦恼?
只要安装了gcc, 用一个文本文档写代码。
用下面这一行就可以编译出可执行文件:
gcc -Wall 你的c文件名 -o test.exe
也不用纠结去选择 什么IDE,什么好用,这个阶段就是打基础。当然,推荐用Vscode,轻量级。
3、总结:
C语言基础不难,难在:
(1)固有认知给自己竖起的高墙
(2)没有精准定位自己的不足
(3)缺乏动手实践-写代码,真正去理解。
(4)战线拉的太长,1-2天,最多1周,拿下它。
本系列回顾清单
- 【给嵌入式新人的几条建议(共勉):一-初入职场】
- 【给嵌入式新人的几条建议(共勉):二-好迷茫,内容好多】
- 【给嵌入式新人的几条建议(共勉):三-C语言基础怎么补?】
- 【给嵌入式新人的几条建议(共勉):早期的我-嵌入式固件工作5个月心得体会】
我是Eric xuan, 一名小厂固件工程师
如果你对我的博客感兴趣,或者有什么想了解的问题
欢迎评论、点赞 和 转发,私信我。
E-mail: 1171213808@qq.com