【给嵌入式新人的几条建议(共勉):三-C语言基础怎么补?】



前言

嵌入式技术涉及的内容十分广泛。不慌,看完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; // 下一个节点指针设为NULL
    return 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周,拿下它。

本系列回顾清单


我是Eric xuan, 一名小厂固件工程师

如果你对我的博客感兴趣,或者有什么想了解的问题
欢迎评论、点赞 和 转发,私信我。
E-mail: 1171213808@qq.com


  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值