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

news2024/9/22 5:31:28

给嵌入式新人的几条建议(共勉):三-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; // 下一个节点指针设为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周,拿下它。

本系列回顾清单

  • 【给嵌入式新人的几条建议(共勉):一-初入职场】
  • 【给嵌入式新人的几条建议(共勉):二-好迷茫,内容好多】
  • 【给嵌入式新人的几条建议(共勉):三-C语言基础怎么补?】
  • 【给嵌入式新人的几条建议(共勉):早期的我-嵌入式固件工作5个月心得体会】

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

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


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深耕编程语言18年,对话 Rust、TypeScript、Nushell 核心贡献者 Sophia Turner | Open AGI Forum

作者 | Annie Xu 采访 | 卢威 责编 | Echo Tang 出品丨GOSIM 开源创新汇 编程语言的种类令人眼花缭乱,但成功的、常用的编程语言却是凤毛麟角。在深耕编程语言研发 18 年的 Sophia June Turner 看来,编程语言成功的关键在于其研发团队的透明度和机制建…

Azure OpenAI Embeddings vs OpenAI Embeddings

题意:Azure OpenAI 嵌入与 OpenAI 嵌入的比较 问题背景: Is anyone getting different results from Azure OpenAI embeddings deployment using text-embedding-ada-002 than the ones from OpenAI? Same text, same model, and the results are cons…

Learning vtkjs之Calculator

过滤器 公式计算器 Calculator 介绍 The Calculator filter is a fast way to add derived data arrays to a dataset. These arrays can be defined over points, cells, or just field data that is “uniform” across the dataset (i.e., constant over all of space). Va…

【小尘送书-第十六期】码农职场:IT人求职就业手册

大家好,我是小尘,欢迎你的关注!大家可以一起交流学习!欢迎大家在CSDN后台私信我!一起讨论学习,讨论如何找到满意的工作! 👨‍💻博主主页:小尘要自信 &#x1…

【JVM】垃圾回收机制、算法和垃圾回收器

什么是垃圾回收机制 为了让程序员更加专注于代码的实现,而不用过多的考虑内存释放的问题,所以在Java语言中,有了自动的垃圾回收机制,也是我们常常提及的GC(Garbage Collection) 有了这个垃圾回收机制之后,程序员只需…

华为路由常见 LSA 类型的产生及作用域和字段详细解读

华为路由常见 LSA 类型的产生及作用域 类型名称描述1路由器 LSA(Router LSA)每个设备都会产生,描述了设备的链路状态和开销。该 LSA 只能在接口所属的区域内泛洪2网络 LSA(Network LSA)由 DR 产生,描述该 …

在cPanelWHM中如何重置 MySQL 用户帐户密码

更改MySQL用户账户密码非常简单。服务器管理员可以在WHM中编辑任何MySQL用户的帐户。cPanel用户可以编辑其帐户管理的数据库的密码。 在WHM中更改MySQL用户帐户密码 打开WHM,在侧边菜单中的SQL服务下选择“Change MySQLUser Password”。Hostease的服务器产品提供稳…

NeRF学习——复现训练中的问题记录

代码复现的框架是基于:pengsida 的 Learning NeRF 希望各位可以通过学习 NeRF-Pytorch 的源码来自己复现一下试试看! 文章目录 1 Windows bug1.1 DataLoader 的多进程 pickle1.2 imageio 输出图片1.3 I/O 2 训练问题2.1 Evaluate 显存爆炸2.2 尝试一2.…

基于VScode和C++实现Protobuf数据格式的通信

目录 1. Protobuf 概述1.1 定义1.2Protobuf的优势 2. Protobuf 语法3、序列号和反序列化3.1 .pb.h 头文件3.2 序列化3.3 反序列化 4、测试用例 Protobuf详细讲解链接 1. Protobuf 概述 1.1 定义 protobuf也叫protocol buffer是google 的一种数据交换的格式,它独立…

递归题解集

目录 递归: 一、汉诺塔问题 1.题目链接:面试题 08.06. 汉诺塔问题 2.题目描述: 3.解法:(递归) 🌵算法思路: 🌵算法流程: 🌵算法代码&…

掌握SEO站外推广优化的五大绝招

对于网站运营者和数字营销人员来说,SEO站外推广是提升网站流量和排名的重要手段。以下是五个有效的SEO站外推广优化方法,希望对大家有所帮助。 1. 高质量的外链建设 高质量的外部链接(Backlinks)是搜索引擎排名的重要因素之一。…

Openboxes开发环境配置及本地化、API测试

目录 Openboxes简介 开发环境配置及启动 更新中文多语言配置 API测试 Openboxes简介 Openboxes是一款开源的仓库管理软件,提供了库存管理、采购管理、销售管理等功能,可以帮助用户高效地管理仓库及库存。并提供了丰富的API接口。系统基于java8 和Gr…

关于微信,qq小程序的登录,数据库-前端-接口解析

一、背景 当我们在对接微信平台,开发微信小程序时,用户标识是必不可少的。用户标识贯通了整个开发过程,所以获取到唯一的用户标识是必须的。 二、多平台兼容 因为考虑到一次开发,可多端运行,需要考虑兼容多平台兼…

SAP 财务管理系统 —— 企业财务智能化的领航者

在当今数字化时代,企业财务管理的智能化已成为推动企业持续增长的关键因素。SAP 财务管理系统通过智能化技术,帮助财务部门提高收入、控制成本并降低财务风险,释放财务数字化转型的价值。财务 ERP 作为 SAP 的核心组成部分,将帮助…

【机器学习】成本函数在逻辑回归中的形式以及逻辑回归的成本函数

引言 在机器学习中,逻辑回归是一种用于二分类问题的线性回归的扩展。逻辑回归的成本函数是用来评估模型预测结果与实际结果之间差异的函数 文章目录 引言一、成本函数在逻辑回归中的形式1.1 成本函数的具体形式1.1.1 对于单个训练样本 二、逻辑回归的成本函数实现2.…

股指期货的期现套利及其作用是什么?

股指期货市场提供了一种独特的投资机会,即通过期现套利策略来捕捉无风险利润。这种策略基于股指期货与对应的现货指数之间的价格差异。当这种差异超出正常范围时,投资者可以利用套利操作来实现稳定收益。 期现套利的核心在于同时买入现货指数的代表性投…

STM32DMA数据传输

我估计大多数人学这么久连听说都没听说过DMA,更不用提知道它是干嘛的。其实DMA的本质就是一个数据的搬运工。平常的时候当我们没有配置的时候,一直都是CPU在搬运数据,但是这个活又累又没有技术含量,所以DMA的重要性还是有的。 目…

centos8.5.2111切换阿里云镜像

备份 mv /etc/yum.repos.d/CentOS-Linux-BaseOS.repo /etc/yum.repos.d/CentOS-Linux-BaseOS.repo.backup下载最新的源 wget -O /etc/yum.repos.d/CentOS-Linux-BaseOS.repo http://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo更改第二个配置文件 cd /etc/yum.repo…

自定义CustomRatingBar控件

通过自定义RatingBar的样式实现⭐️⭐️⭐️指示器的方式功能过于受限,而且显示的样式阴影会受到影响。 系统自带显示: 自定义样式: 因此简单自一个符合要求的 CustomRatingBar 支持设置星星数量支持设置星星Rating(float)支持设置空显示…

计算机毕业设计选题推荐-健康饮食系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…