
黑猫带你学:嵌入式C语言
文章平均质量分 74
该专栏包含C基础教程、数据结构与算法、C高级编程、易错易忘知识点等内容,基本涵盖嵌入式C编程大部分内容,适合小白到高手任一阶段人群,物超所值,欢迎订阅!!!
优惠券已抵扣
余额抵扣
还需支付
¥99.90
¥299.90
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
黑猫学长呀
芯片行业嵌入式攻城狮一枚~
展开
-
【嵌入式C基础】第1篇:基本数据类型
1 整数类型(0正1负)1.1 规则1.所有整数类型都分为:有符号类型(signed)和无符号类型(unsigned)short a; //默认为有符号类型short a; == signed short a;unsigned short a; //无符号类型a unsigned short a = 20;//正确 unsigned short a = -1;//错误,这里语法上并不会报错,但是实际上值就并不是-1了,实际上为255了。2.字符型: 0 - 31 无法在终端上显原创 2021-10-28 21:07:00 · 488 阅读 · 0 评论 -
【嵌入式C基础】第2篇:进制转换与BCD编码
1 前言D 十进制B 二进制H 十六进制什么是权?权:权指的是数据中每一位的基本单位。例如十进制中数字123,那个3是各位,权为1,2是十位,权为10,1是百位,权是100.十进制 10的i次方(i表示第几位)二进制 2的i次方其他同理2 非十进制转十进制3 十进制转非十进制3.1 十进制转二进制整数部分转换为二进制数时采用“除2取余”的方法,即连续除2并取余数作为结果,直至商为0,得到的余数从低位到高位依次排列即得到转换后二进制数的整数部分;对小数部分,则用“乘2取原创 2021-10-28 21:19:01 · 341 阅读 · 0 评论 -
【嵌入式C基础】第3篇:常量和变量
1 常量常量:不允许被改变的量成为常量1.1 整形常量十进制常量 100八进制常量 0100(八进制常量以0开头) 十六进制常量 0x100100L 100l 长整型的100100UL 100ul 无符号长整型100int a = 100L;(long int型也为4字节)1.2 浮点型常量3.14153.1415e15(即3.1415乘以10的15次方)3.1415e-153.1415E153.1415E-151.3 字符常量‘a’‘A’’原创 2021-10-28 21:32:10 · 280 阅读 · 0 评论 -
【嵌入式C基础】第4篇:运算符的使用
1 算数运算符+ - * /% :不能对浮点数操作,只能对整型数操作结果为整数61.1 i++和++i++:i++ 先用再加,不用等到该语句完成再加(即不用等到该行“;”再加)++i 先加再用–:与++一样1、i++ 不能作为左值,而++i 可以。2、记住一点,++i在i所在的内存中直接加的,直接就改变了内存的值。而i++是会申请一块相同的内存空间存放i++,等用完i以后,再把i++的值放在i所在的空间。以下例子好好看看!i = 3a = ++i + i++;原创 2021-10-28 21:49:28 · 216 阅读 · 0 评论 -
【嵌入式C基础】第5篇:原码/反码/补码
1 概念原码正数原码 = 反码 = 补码反码负数:符号位不变,数值位取反补码负数:反码加1得到补码2 有符号数在内存中的存储方式有符号数在内存中转化为二进制补码进行保存,无符号数直接转化为二进制存储。转化为反码,符号位不变。有符号数表示方法3种:原码、反码、补码构成:符号位+数值部分组成符号位:1 负 0 正例题1:有符号数在内存中为1001 0110,对应十进制数为多少?注意:为有符号数,且符号位为1,即负数,则1001 0110为该数补码所以该数反码为100原创 2021-10-28 21:52:57 · 266 阅读 · 0 评论 -
【嵌入式C基础】第6篇:超详细的常用的输入输出函数讲解
stdio.h 标准输入输出库putchar 向终端输出一个字符getchar 从终端获取一个字符printf 向终端输出格式化字符串scanf 从终端读取格式化字符串puts 向终端输出一个字符串gets 从终端读取一个字符串1 putcharint putchar (int ch);参数:ch为要输出的字符,该字符以其对应的 int 值进行传递。返回值:输出成功,返回该字符的ASCII码值,否则返回EOF。功能:向终端输出一个字符特性:1.向终端输出的是字符 2原创 2021-10-28 22:12:56 · 337 阅读 · 0 评论 -
【嵌入式C基础】第7篇:C语言流程控制详讲
1 顺序结构程序 -> main函数第一句开始 -> 执行到main函数结束程序顺序向下执行2 分支语句2.1 if分支判断使用if分支,相同类型的数据想执行不同的代码使用if分支三种类型:1、简单分支:if (A){ B;}else{ C;}注意:1.if能够脱离else单独使用,但else不能脱离if单独使用2.if后能加判断条件,else后不能加判断条件3.如果不加大括号,if能够默认控制一个语句块,但工程中if无论控制几句代码都需加入括号练习:原创 2021-10-28 22:32:13 · 209 阅读 · 0 评论 -
【嵌入式C基础】第8篇:C语言数组讲解
1 概述数组的基本概念:同一类型数据的集合1.1 数组的定义存储类型 数据类型 数组名[元素个数];int a[5];元素个数必须为常量,不能为变量1.2 数组的初始化int a;数组初始化方法全部初始化:int a[5] = {1, 2, 3, 4, 5};局部初始化:int a[5] = {1, 2, 3};注意:其他的即为0;常用:int arr[5] = {0}; //初始化一个全部元素为0的数组,通常这个方法在清0数组时使用默认初始化:int a[] = {原创 2021-10-28 22:39:51 · 381 阅读 · 0 评论 -
【嵌入式C基础】第9篇:C语言指针的基本用法
1 概述地址:区分内存空间不同的编号称为地址指针:指针就是地址,地址就是指针指针变量:存储指针的变量称为指针变量32bit操作系统中,指针占4字节;64bit操作系统中,指针占8字节1.1 指针的定义int *p; //p里存放的是地址,p本身是指针变量char *p;float *p;1.2 指针操作变量操作变量两种方式:1.直接访问使用变量名访问2.间接访问使用指针访问&:取地址运算符*:取空间运算符1.3 指针的算数运算+-++:指针向内存高地原创 2021-10-30 16:19:37 · 212 阅读 · 0 评论 -
【嵌入式C基础】第10篇:C函数讲解(附大量示例)
函数的作用(1)避免重复性代码出现(2)将一个功能代码进行封装函数的调用函数名(实参1, 实参2, …);实参类型强制转化为形参类型实参个数和形参个数必须一一对应1 定义/声明/传参1.1 函数的定义函数(返回值)数据类型 函数名(数据类型1 形参1, 数据类型2 形参2, …){函数体;return 返回值;}返回值如果和函数数据类型不同,则会强制转化为函数数据类型,再返回给调用函数1.2 函数的声明声明一个函数的参数个数及参数类型还有返回值类型函数类型不写默认原创 2021-10-30 16:56:27 · 383 阅读 · 0 评论 -
【嵌入式C基础】第11篇:C语言中32个关键字
1 所有关键字auto 声明自动变量short 声明短整型变量或函数int 声明整型变量或函数long 声明长整型变量或函数float 声明浮点型变量或函数double 声明双精度变量或函数char 声明字符型变量或函数struct 声明结构体变量或函数union 声明共用数据类型enum 声明枚举类型typedef 用以给数据类型取别名const 声明只读变量unsigned声明无符号类型变量或函数signed 声明有符号类型变量或函数extern 声明变量是在其他文件正声原创 2021-10-30 17:00:07 · 235 阅读 · 0 评论 -
【嵌入式C基础】第12篇:构造数据类型(结构体、联合体、枚举)
1 struct1.1 结构体的定义struct 结构体名{数据类型1 成员变量1;数据类型2 成员变量2;数据类型3 成员变量3;…};注意:结构体的名字叫做struct student而不是studenttypedef struct的时候,为什么可以有两个名称,两个名称的区别?https://blog.youkuaiyun.com/bxlsky/article/details/9769783关于typedef定义结构体别名与本名相同问题:参考链接:https://bbs.youkuaiyun.com原创 2021-10-30 17:28:09 · 260 阅读 · 0 评论 -
【嵌入式C基础】第13篇:内存大小端
1 什么是大小端大端(储存)模式:指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中小端(储存)模式:指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中大小端的产生:因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在c语言中除了8bit的char之外,还有16bit的short型,32bit的long型,另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何原创 2021-10-30 17:32:50 · 234 阅读 · 0 评论 -
【嵌入式C基础】第14篇:引用
C语言没有引用,C++才有引用!这里非常容易搞混,切记。1 什么是引用引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名;【例1】:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名说明: (1)&在此不是求地址运算,而是起标识作用。 (2)类型标识符是指目标变量的类型。 (3)声明引用时,必须同时对其进行初始化。 (4)引用声明完毕后,相当于目标变量名有两原创 2021-10-30 17:38:56 · 256 阅读 · 0 评论 -
【数据结构与算法】第1篇:链表基础讲解
1 概述链表是一直常见且重要的数据结构。它是动态地进行存储分配的一种结构。节点:链表中每个元素称为节点。2 链表创建2.1 静态链表静态链表:所有节点都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称之为静态链表。【例程】#include <stdio.h>struct student{ char *name; unsigned int score; struct student *next;};void main(void){ stru原创 2021-10-30 17:48:40 · 192 阅读 · 0 评论 -
【linux环境高级编程】第1篇:标准IO操作
1 前言1.1 声明本文根据个人工作经验及部分网络资料整理而成,如有错误请留言。文章为个人辛苦整理,付费内容,禁止私自转载。文章所在专栏:《黑猫带你学:嵌入式C语言》1.2 参考链接标准IO:常用函数集合(写的很不错,墙裂推荐查看):https://www.cnblogs.com/ye-long/p/7202655.html标准IO库详解及实例:https://www.cnblogs.com/noticeable/p/8476036.htmlC 标准库 - <stdio.h>原创 2021-10-30 20:44:05 · 207 阅读 · 0 评论 -
【linux环境高级编程】第2篇:文件IO操作
1 概述操作系统为了方便用户使用系统功能而对外提供的一组系统函数。称之为 系统调用,其中有文件IO一般都是对设备文件操作,当然也可以对普通文件进行操作。一个基于Linux内核的没有缓存的IO机制。特性:1 没有缓存区 2 操作对象不在是流,而是文件描述符 3文件描述符 很小的非负的整数 int 0-1023(最多同时打开1024个文件) 内核每打开一个文件就会获得一个文件描述符每个程序在启动的时候操作系统默认为其打开三个描述符与流对象匹配:0 ==>STDIN_原创 2021-10-30 20:48:51 · 237 阅读 · 0 评论 -
【linux环境高级编程】第3篇:目录操作
1 概述目录操作框架:1,打开目标目录2.读取目录3.关闭目录目录当做文件看,只不过操作函数和操作文件函数不一样。2 相关函数DIR *opendir(const char *name);功能:打开一个目录获得一个目录流指针参数:name:目录名返回值:成功返回目录流指针 失败返回NULLstruct dirent *readdir(DIR *dirp);功能:从目录流中读取文件信息并将保存信息的结构体参数:dirp:目录流指针返回值:包含文件信息的结构体 出错或者读到目录原创 2021-10-30 20:54:48 · 158 阅读 · 0 评论 -
【linux环境高级编程】第4篇:系统时间的获取
1.获取秒数 2.转换为需要个格式参考链接:C 标准库 - <time.h>——菜鸟教程:https://www.runoob.com/cprogramming/c-standard-library-time-h.htmltime_t time(time_t *t); 功能:获得1970年到现在的秒数,如果t 并非空指针的话,此函数也会将返回值存到t 指针所指的内存。参数:t:存放秒数的空间首地址返回值:成功返回1970年到现在的秒数 失败返回-1头文件:#include &原创 2021-11-01 20:44:54 · 148 阅读 · 0 评论 -
【linux环境高级编程】第5篇:用户、组操作
该类函数都是c库函数。struct passwd *getpwuid(uid_t uid);功能:根据用户id到/etc/passwd文件下解析获得结构体信息,获得用户相关信息参数:uid:用户id返回值:成功返回id对应用户的信息 失败返回NULL头文件:#include <sys/types.h> #include <pwd.h>passwd结构体:struct passwd { char *pw_name; /* 用户名*/原创 2021-11-01 20:49:23 · 168 阅读 · 0 评论 -
【linux环境高级编程】第6篇:链接文件
1 什么是软链接、硬链接该小节内容参考:Linux中的软链接和硬链接:https://blog.youkuaiyun.com/lws123253/article/details/88747800在linux系统中,硬链接(hard link)和软链接(symbolic link,也叫符号链接)是两个非常重要的概念,而很多朋友在学习的时候,通常不容易区分这两个概念,所以在这里做一些记录,大家共同进步。在正式开始说明前,先讲一些不算是题外话的题外话。对于linux有一定了解的朋友都知道linux里面有一个重要的原创 2021-11-01 20:54:40 · 148 阅读 · 0 评论 -
【linux环境高级编程】第7篇:linux系统进程详解,看这一篇就够了
1 前言1.2 参考链接国嵌学习链接:https://www.bilibili.com/video/BV1Gi4y1G7MM?from=search&seid=6289925691599795128linux系统编程:https://www.cnblogs.com/mickole/category/496206.html?page=12 概述2.1 进程的含义进程是一个程序执行的过程,会去分配内存资源,cpu的调度pcb 是一个结构体,process control block原创 2021-11-01 21:17:23 · 254 阅读 · 0 评论 -
【C语言易错点】第1篇:关于数组中元素个数必须为常量,不能为变量的验证
参考例程。例子中所有测试代码都是用gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0进行编译的。test1函数是可行的。但是网上也有人说编译不过,貌似原因在于使用的编译器不一样,听说C99标准支持,有的标准不支持。test2编译不过,定义int a[num];的时候,num是个不确定的值。test3/4/5都是可行的。由此得出结论:数组元素中个数必须为常量,不能为变量,所述不是很正确,即使是变量也有可能可以。其实其愿意应该是数组元素中个数必须是确定,不能是不确定的个原创 2021-07-05 20:01:14 · 3097 阅读 · 0 评论 -
【C语言易错点】第2篇:指针常量与常量指针
本文部分内容参考:http://c.biancheng.net/view/367.html文章所在专栏:《黑猫带你记:C语言易错易忘知识点》1 指针常量指针常量本质是一个常量,而用指针修饰它,那么说明这个常量的值应该是一个指针。指针常量 的值是指针,这个值因为是常量,所以不能被赋值。因为指针常量是一个常量,在声明的时候一定要给它赋初值。一旦赋值,以后这个常量再也不能指向别的地址。下面的例子展示了指针常量不同于指向常量的指针:指针常量加1,实际上值变化了4:int* const a = 1;.原创 2021-08-22 11:27:41 · 251 阅读 · 0 评论 -
【C语言易错点】第3篇:指针数组与数组指针,看这一篇就够了(附例程)
1 前言1.1 声明本文依据个人学习及工作经验整理而成,如有错误请留言。文章为个人辛苦整理,付费内容,禁止私自转载。文章所在专栏:《黑猫带你记:C语言易错易忘知识点》1.2 内容概要1、什么是指针数组/数组指针,有什么区别?2、指针数组的几种写法3、如何取数组中单个元素的地址4、数组在内存空间上是连续的吗5、使用例子讲解具体知识点1.3 参考链接指针的高阶用法——指针数组:https://www.cnblogs.com/JingWenxing/p/10263865.html数组原创 2021-08-22 17:20:52 · 286 阅读 · 0 评论 -
【C语言易错点】第4篇:结构体在内存中存储规则详讲
1 不包含位域对齐方式:字节对齐(1 b)、半字对齐(2 b)、字对齐(4 b)上图中s占用16字节2 包含位域C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。 位段成员必须声明为int、unsigned int或signed int类型(short char long)。struct 位域结构名原创 2021-08-25 12:25:45 · 263 阅读 · 0 评论