
C/C++
文章平均质量分 84
C语言知识分享
果果小师弟
微信公众号:果果小师弟,电子信息在读研究生
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
果果带你写链表,小学生看了都说好
非常详细的讲解了C语言的链表原创 2022-06-14 16:37:20 · 822 阅读 · 4 评论 -
嵌入式C代码的十种优化方案
摘要:代码的优化是有侧重点的,优化是一门平衡的艺术,它往往要以牺牲程序的可读性或者增加代码长度为代价。在嵌入式开发中对程序执行速度的要求比较高,所以学好做好代码优化可以让你的代码执行效率更高。一、选择合适的算法和数据结构选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。数组与指针语句具有十分密切的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。在许多种情况下,可以用指针转载 2022-03-13 10:09:56 · 3401 阅读 · 3 评论 -
这是我看过最全面讲解嵌入式C语言回调函数和函数指针的教程
摘要:函数指针是指向函数的指针变量。通过函数指针C语言可以实现各种强大的功能与设计方法。而回调函数是函数指针最常见的用途,也是C语言面试当中的必考知识点和难点。在我们平时开发STM32或者其它单片机时,我们经常都会用到原厂提供的固件库函数,固件库函数中有非常多回调函数。那么什么是回调函数呢?回调函数是作为参数传递给另一个函数的函数。接受回调作为参数的函数预计会在某个时间点执行它。回调机制允许下层软件层调用上层软件层定义的函数。原创 2021-12-09 12:36:23 · 3228 阅读 · 7 评论 -
如何正确的理解指针和结构体指针?
作者一直觉得C语言较其他语言最伟大的地方就是C语言中的指针,有些人认为指针很简单,而有些人认为指针很难,当然这里的对简单和难并不是等价于对指针的理解程度。为此作者在这里对C语言中的指针进行全面的总结,从底层的内存分析,彻底让读者明白指针的本质。作者认为C指针应该和C语言中的变量放在一起,因为C指针本质上还是一个变量,但现在大部分教材将其单独拿出来讲解,这也使得很多初学者认为指针是一个和变量毫无相关的概念。指针变量首先读者要明白指针是一个变量,为此作者写了如下代码来验证之:#include "stdi转载 2021-12-08 20:46:36 · 5412 阅读 · 1 评论 -
大端模式、小端模式、高字节序、低字节序、MSB、LSB
摘要:内存的读写永远从低地址开始读/写,从低到高!从低到高!从低到高!内存的读写永远从低地址开始读/写!!!字节序、比特序字节序就是串行发送多字节时发送的顺序,比如a=0x12345678,按字节发送是0x12 0x34 0x56 0x78顺序还是0x78…0x12顺序比特序同理但在bit层面进行排序,如果一个字节,指先发bit0 还是bit7, 如果是一个Word型,先发bit31还是先发bit0串口是LSB优先,I2C是MSB优先,这里的MSB、LSB指的是比特序,二进制位的位置,区别于【字节序原创 2021-08-08 14:37:41 · 33509 阅读 · 13 评论 -
ASCII对照表
1、可显示字符2、不可显示字符(控制字符)原创 2021-06-26 09:06:23 · 1991 阅读 · 0 评论 -
干货|手把手教你写单片机的结构体
摘要:听说还有好多学单片机的小伙伴不会用结构体?指针和结构体是学单片机必须要掌握的,如果你C语言掌握的不牢,单片机根本学不到精髓,只能完非常低级的项目。看得懂结构体并且能够灵活运用结构体才能说你入门了单片机。本篇将以最通俗的方式结合STM32单片来将将结构体的运用。解决你学完C语言、考过了计算机二级还是看不懂单片机结构体的苦恼。宝藏文章,记得点赞转发收藏。大家知道指针和结构体是单片机的难点,所以就去学习C语言,找视频看书…这里面每一个视频的播放量都非常高。对于单纯的学习C语言,这里讲的很清楚。看完你不原创 2021-05-09 10:50:48 · 12810 阅读 · 36 评论 -
STM32单片机修改寄存器的位操作方法(全网最全)
使用 C语言对寄存器赋值时,我们常常要求只修改该寄存器的某几位的值,且其它的寄存器位不变,这个时候我们就需要用到 C 语言的位操作方法了。1. 把变量的某位清零此处我们以变量 a代表寄存器,并假设寄存器中本来已有数值,此时我们需要把变量a 的某一位清零,且其它位不变。//定义一个变量 a = 1001 1111 b (二进制数)unsigned char a = 0x9f;//对 bit2 清零a &= ~(1<<2);//括号中的 1 左移两位,(1<<原创 2021-04-23 09:45:54 · 4323 阅读 · 0 评论 -
程序是如何运行的呢?
摘要:计算机的内存,计算机当中所有程序的运行都在内存中进行,也就是你电脑的内存条中运行的。计算机内存也被称为随机访问存储器,Random Access Memory,简称R-A-M。内存一般用于存放程序指令和运算数据,帮助CPU与硬盘等外部存储设备进行数据的交换,内存只能临时存放程序的指令和数据,当电脑关闭之后,内存当中的数据就会随之消失。计算机当中的程序指令,或者是操作数据都是以二进制的形式在内存当中存储和计算的。我们可以将内存看作是排成一排的方格,每个方格可以存储0或者是1这两种数字。这其.原创 2021-01-28 20:51:28 · 4253 阅读 · 0 评论 -
C/C++动态内存管理malloc/new、free/delete的异同
每个应用都有自己的独立内存空间,起空间一般都有以下几大区域:代码段(代码区)这个代码段代码区一般放什么东西呢?用于存放代码 什么意思?就是我们编写的这些C++代码,或者说其他编程语言代码,不管用什么编程语言写代码。最终是不是都编译成01010101这些机器指令,也就是机器码将来跑起来就是你这个应用程序跑起来,你这些代码这机器吗?放在内存的什么地方释放内存的代码区啊?这个区域一般来说是只读的,只读就是不能改,只能读取里面代码,然后执行里面的代码就不能去改你们的东西。数据段(全局区)定义在函数外部的变原创 2021-01-23 15:08:22 · 494 阅读 · 0 评论 -
你知道你的代码容量有多大吗?
从编译信息可以看出,我们的代码占用 FLASH 大小为:33144字节(26580+6564),也就约等于32KB,所用的 SRAM 大小为:1704个字节(56+1648),也就约等于1.6KB。这里我用的是STM32F103RCT6,这款芯片的FLASH容量为256KB,运行内存为64KB。所以说我们的程序相对于芯片的容量来说还不算太大。这里我们解释一下,编译结果里面的几个数据的意义:Code:表示程序所占用 FLASH 的大小(FLASH)。RO-data:即 Read Only-data,表.原创 2020-12-31 09:07:40 · 3820 阅读 · 0 评论 -
STM32中断标志:先清理后清理的区别
各种教程中,都只解释中断的机制、使用。但对于中断标志的清理顺序,没多少官方准确的资料。今天在F429的代码里,又遇到问题:进中断后卡死跳不出来,各种排查没发现问题。快要出门时,才突然想起来,要把清理中断的语句,从最后一行,移到第一行。重新编译烧录,马上通过。真是奇怪的问题。例1:后清理,卡死测试环境:F429IG + TIM6的中断void TIM6_DAC_IRQHandler(){ LED_BLUE_TOGGLE ; // 反转LED TIM6->SR转载 2020-12-29 16:31:26 · 2174 阅读 · 0 评论 -
STM32的ADC采样
ADC.c#include "adc.h"#include "delay.h"void Adc_Init(void){ ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE ); //使能ADC1通道时钟 RCC_ADCCLKConfig(R原创 2020-12-26 15:53:12 · 3570 阅读 · 0 评论 -
正点原子STM32的SYSTEM中的delay、sys.c、usart.c文件代码
delay.c#include "delay.h"static u8 fac_us=0; //us延时倍乘数 static u16 fac_ms=0; //ms延时倍乘数,在ucos下,代表每个节拍的ms数 //初始化延迟函数//当使用OS的时候,此函数会初始化OS的时钟节拍//SYSTICK的时钟固定为HCLK时钟的1/8//SYSCLK:系统时钟void delay_init(){ SysTick_CLKSourceConfig(Sy原创 2020-12-25 19:21:05 · 17812 阅读 · 5 评论 -
小师妹教我用MFC写了一个应用小程序...
前两天一个学妹问我,说她想做串口调试助手当做毕业设计,老师告诉她说用MFC去做,还给了他相关的代码。问我知道MFC吗?(我只知道KFC)然后我跟她说你老师为啥要让你用MFC,你学过C++,直接用QT不可以吗?我这里有关于QT的相关代码,你直接拿过去改一改,美化一下,就可以当做毕设了。然后过了两天,她又告诉我,说她老师不太了解QT,只用过MFC。确实,有一些年纪比较大的老师可能在工作时用的就是MFC,QT毕竟是最近几年才兴起的技术(零几年之后)。原创 2020-12-24 16:28:14 · 6588 阅读 · 2 评论 -
vs2010调试c++总是说此项目已经过期怎么办
vs是不会自动编译的,也就是说,你修改了代码,没有重新编译就直接运行,编译器就会弹出这个提示,提醒你要重新编译再运行!这样运行的结果才是跟你现在的代码匹配的.否则你就是运行之前编译的程序!养成最基本的习惯: 编译了再运行.也就是先生成解决方案,再调试就没了...原创 2020-12-24 09:38:52 · 11793 阅读 · 1 评论 -
编程知识_字节序_位操作
1. 字节序额外的小知识1Tbyte=1024Gbyte,1Gbyte=1024Mbyte,1Mbyte=1024Kbyte,(1Mb=1024x1024个字节)1Kbyte=1024byte, (1KB=1024个字节)1byte=8bit(一个字节由8个二进制位组成)int i;int类型占4个字节就是4x8=32个bit位(最大可表示的数为2^31-1=2147483647)double i;double类型占8个字节就是8*8=64个bit位(最大可表示的数为2^63-1)另外:原创 2020-11-08 18:48:03 · 1466 阅读 · 0 评论 -
C++核心编程4— 类和对象
C++面向对象的三大特性为:封装、继承、多态C++认为万事万物都皆为对象,对象上有其属性和行为例如: 人可以作为对象,属性有姓名、年龄、身高、体重…,行为有走、跑、跳、吃饭、唱歌… 车也可以作为对象,属性有轮胎、方向盘、车灯…,行为有载人、放音乐、放空调… 具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类4.1 封装4.1.1 封装的意义封装是C++面向对象三大特性之一封装的意义:将属性和行为作为一个整体,表现生活中的事物将属性和行为加以权限控制封装意义一:原创 2020-09-20 22:07:02 · 1175 阅读 · 0 评论 -
C++核心编程3—函数提高
3.1 函数默认参数在C++中,函数的形参列表中的形参是可以有默认值的。语法:返回值类型 函数名 (参数= 默认值){}示例:int func(int a, int b = 10, int c = 10) { return a + b + c;}//1. 如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值//2. 如果函数声明有默认值,函数实现的时候就不能有默认参数int func2(int a = 10, int b = 10);int func2(int a,原创 2020-09-20 17:27:42 · 586 阅读 · 0 评论 -
C++核心编程2—引用
2.1 引用的基本使用作用: 给变量起别名语法: 数据类型 &别名 = 原名示例:# include<iostream>using namespace std;int main() {//引用基本语法//数据类型 &别名 = 原名 int a = 10; //创建引用 int &b = a; cout << "a = " << a << endl; cout << "b = " <<原创 2020-09-20 16:48:45 · 684 阅读 · 0 评论 -
C++核心编程1—内存分区模型
针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓。1 内存分区模型C++程序在执行时,将内存大方向划分为4个区域代码区:存放函数体的二进制代码,由操作系统进行管理的全局区:存放全局变量和静态变量以及常量栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收内存四区意义:不同区域存放的数据,赋予不同的生命周期, 给我们更大的灵活编程1.1 程序运行前在程序编译后,生成了exe可执行程序,未执行该程序前分原创 2020-09-18 22:15:21 · 579 阅读 · 0 评论 -
【C语言笔记】全局变量和局部变量
一、全局变量例子1在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件。int a, b; //全局变量void func1( ){}float x,y; //全局变量int func2( ){}int main( ){return 0;}a、b、x、y 都是在函数外部定义的全局变量。C语言代码是从前往后依次执行的,由于 x、y 定义在函数 func1() 之后,所以在 func1原创 2020-09-14 09:23:00 · 1565 阅读 · 0 评论 -
【C语言笔记】枚举
1、如果一个变量只有几种可能的值,则可以定义为“枚举类型”;所谓“枚举”就是把可能的值一一的列举出来,变量的值只限于列举出来的值的范围, 如:enum 枚举类型{枚举成员列表};//其中的枚举成员列表是以逗号“,”相分隔如:enum Spectrum{red,black,yellow,blue,white};2、可以用“枚举类型”声明符号名称来表示int型常量。只要是能使用int型的地方就能够使用枚举类型。注意:C语言中的枚举的一些特性不适合C++;比如c中的枚举变量允许使用++运算符,但是c++原创 2020-09-14 09:17:02 · 648 阅读 · 0 评论 -
【C语言笔记】struct结构体变量的用法
我们都知道C语言中变量的类型决定了变量存储占用的空间。当我们要使用一个变量保存年龄时可以将其声明为int类型,当我们要使用一个变量保存某一科目的考试成绩时可以将其声明为float。那么,当我们要做一个学生信息管理系统时,需要保存学生的姓名、学号、年龄等信息,该怎么做呢?是不是这样定义zhangsan.name=Liuyaozhangsan.nam=520zhangsan.age=24但是zhangsan.name这个东西我们可是没有学过啊!所以就出现了结构体什么是结构体?结构体(stru原创 2020-09-14 09:10:26 · 20016 阅读 · 1 评论 -
【C语言笔记】#define与typedef的区别?
1、#define#define是预处理指令,在编译时不进行任何检查,只进行简单的替换宏定义的一般形式为:define 标识符 常量这里所说的字符串是一般意义上的字符序列,不要和C语言中的字符串等同,它不需要双引号。举个例子# include <stdio.h># include <stdlib.h># define URL "https://www.liuyao-blog.cn"# define NAME "小师弟"# define WeiX原创 2020-09-14 09:02:30 · 1326 阅读 · 0 评论 -
一篇大佬写的嵌入式C语言知识点万字总结
怎么做好嵌入式?相信这个问题无论问谁你都会得到一句学好C语言!今天推荐一篇大佬写的嵌入式C语言知识点总结,非常值得一读。从语法上来说C语言并不复杂, 但编写优质可靠的嵌入式C程序并非易事,不仅需要熟知硬件特性和缺陷,还需要对编译原理和计算机技术知识有着一定的了解。本文以嵌入式实践为基础,再结合相关资料, 阐述嵌入式需要了解的C语言知识和重点,希望每个读到这篇文章的人都能有所收获。1 关键字关键字是C语言中具有特殊功能的保留标示符,按照功能可分为1). 数据类型(常用char, short, in原创 2020-08-21 18:47:04 · 1609 阅读 · 0 评论 -
Vscode控制台输出中文乱码
当我们第一次用Vscode编写C++或C代码时候会发现控制台输出的中文汉字却是乱码,如下图:这是因为我们的控制台编码是GBK编码。C/C++语言的运行程序是调用的cmd.exe,而window的cmd的编码默认为936也就是GB2312。运行—>cmd—>在白色窗口头部点击右键—>属性 可以查看到。但是我们的 . cpp 文件确是UTF8编码。那当然会出现乱码了啊,你的 .cpp 文件是UTF8编码但是你的控制台确是GBK编码,现在我们只需要把UTF8编码改成GBK编码。方法原创 2020-08-10 12:10:43 · 10190 阅读 · 13 评论 -
零基础入门C++(8)—结构体
8 结构体8.1 结构体基本概念结构体属于用户自定义的数据类型,允许用户存储不同的数据类型8.2 结构体定义和使用语法:struct 结构体名 { 结构体成员列表 };通过结构体创建变量的方式有三种:struct 结构体名 变量名struct 结构体名 变量名 = { 成员1值 , 成员2值…}定义结构体时顺便创建变量示例://结构体定义struct student{ //成员列表 string name; //姓名 int age; //年龄 int sco原创 2020-08-09 18:43:58 · 719 阅读 · 1 评论 -
零基础入门C++(7)—指针
7 指针7.1 指针的基本概念指针的作用: 可以通过指针间接访问内存内存编号是从0开始记录的,一般用十六进制数字表示可以利用指针变量保存地址7.2 指针变量的定义和使用指针变量定义语法: 数据类型 * 变量名;示例:int main() { //1、指针的定义 int a = 10; //定义整型变量a //指针定义语法: 数据类型 * 变量名 ; int * p; //指针变量赋值 p = &a; //指针指向变量a的地址 cout <&原创 2020-08-09 18:43:36 · 551 阅读 · 0 评论 -
零基础入门C++(6)—函数
6 函数6.1 概述**作用:**将一段经常使用的代码封装起来,减少重复代码一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能。6.2 函数的定义函数的定义一般主要有5个步骤:1、返回值类型2、函数名3、参数表列4、函数体语句5、return 表达式语法:返回值类型 函数名 (参数列表){ 函数体语句 return表达式}返回值类型 :一个函数可以返回一个值。在函数定义中函数名:给函数起个名称参数列表:使用该函数时,传入的数据原创 2020-08-09 18:43:03 · 517 阅读 · 0 评论 -
零基础入门C++(5)—数组
5 数组5.1 概述所谓数组,就是一个集合,里面存放了相同类型的数据元素**特点1:**数组中的每个数据元素都是相同的数据类型**特点2:**数组是由连续的内存位置组成的[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CvjorH5w-1596969015861)(assets/1541748375356.png)]5.2 一维数组5.2.1 一维数组定义方式一维数组定义的三种方式:数据类型 数组名[ 数组长度 ];数据类型 数组名[ 数组长度 ] = {原创 2020-08-09 18:42:29 · 531 阅读 · 0 评论 -
零基础入门C++(4)—程序流程结构
程序流程结构1 选择结构1.1 if语句1.2 三目运算符1.3 switch语句2 循环结构2.1 while循环语句2.2 do...while循环语句2.3 for循环语句C/C++支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构顺序结构:程序按顺序执行,不发生跳转选择结构:依据条件是否满足,有选择的执行相应功能循环结构:依据条件是否满足,循环多次执行某段代码1 选择结构1.1 if语句作用: 执行满足条件的语句if语句的三种形式单行格式if语句多行格式if语句多原创 2020-07-26 23:23:12 · 612 阅读 · 0 评论 -
零基础入门C++(3)—运算符
运算符1 算术运算符2 赋值运算符3 比较运算符4 逻辑运算符作用: 用于执行代码的运算本章我们主要讲解以下几类运算符:运算符类型作用算术运算符用于处理四则运算赋值运算符用于将表达式的值赋给变量比较运算符用于表达式的比较,并返回一个真值或假值逻辑运算符用于根据表达式的值返回真值或假值1 算术运算符作用:用于处理四则运算算术运算符包括以下符号:运算符术语示例结果+正号+33-负号-3-3+加10原创 2020-07-26 23:20:35 · 731 阅读 · 0 评论 -
零基础入门C++(2)—数据类型
数据类型1 整型2 sizeof关键字3 实型(浮点型)4 字符型5 转义字符6 字符串型7 布尔类型 bool8 数据的输入C++规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存1 整型作用:整型变量表示的是整数类型的数据C++中能够表示整型的类型有以下几种方式,区别在于所占内存空间不同:数据类型占用空间取值范围short(短整型)2字节(-2^15 ~ 2^15-1)int(整型)4字节(-2^31 ~ 2^31-1)l原创 2020-07-26 23:18:32 · 611 阅读 · 1 评论 -
零基础入门C++(1)—C++初识
本教程采用vscode编译器来编译运行C++,不采用vs studio。C++基础入门1 C++初识1.1 第一个C++程序#include <iostream>using namespace std;int main() { cout << "Hello world" << endl; return 0;}1.2 注释作用:在代码中加一些说明和解释,方便自己或其他程序员程序员阅读代码两种格式单行注释:// 描述信息通常放在一行.原创 2020-07-26 17:03:06 · 685 阅读 · 0 评论 -
STM32-内存五区
局 部 变 量、全 局 变 量 、堆 、堆 栈 、静 态 和 全局一个由C/C++编译的程序占用的内存分为以下几个部分栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。堆区(heap) — 由程序员分配和释放,若程序员不释放,程序结束时可能由OS回收。全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域...原创 2020-03-23 19:12:17 · 1850 阅读 · 1 评论 -
让你不再害怕指针——C指针详解(经典,非常详细)
前言:复杂类型说明要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总结了一下其原则:从变量名处起,根据运算符优先级结合,一步一步分析.下面让我们先从简单的类型开始慢慢分析吧int p; //这是一个普通的整型变量i...转载 2020-03-15 11:36:42 · 703 阅读 · 0 评论 -
C语言指针详解,指针原来这么简单
指针是一个特殊的变量,它里面存储的数值被解释为内存里面的一个地址想要彻底搞懂它,就必须从计算机的底层进行解释,这是你的内存条,内存在物理上是由一组DRAM芯片组成,程序在运行时。数据便被保存在其中,而作为一个程序员,我们无需了解内存的物理结构,操作系统将硬件和软件结合起来,给程序员提供了一种对物理内存空间的抽象,这就是虚拟存储器。虚拟存储器是一块很大的空间,可以把它看成一个一个连续的小方格,每...原创 2020-03-14 22:24:45 · 2875 阅读 · 2 评论 -
#Pragma Pack(n)内存分配
文章目录1、基本数据类型所占内存大小2、对齐规则3、举例说明#Pragma Pack主要是用在字节对齐方面,为什么要对齐呢?因为计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。#Pragma Pack...原创 2020-03-13 10:59:50 · 1024 阅读 · 0 评论 -
bmp图片灰度化和二值化
C语言去除bmp图片的背景一、前言二、灰度化头文件C文件三、二值化一、前言图像处理中,大部分的处理方法都需要事先把彩色图转换成灰度图才能进行相关的计算、识别。彩色图转换灰度图的原理如下:我们知道彩色位图是由R/G/B三个分量组成,其文件存储格式为BITMAPFILEHEADER+BITMAPINFOHEADER,紧跟后面的可能是:如果是24位真彩图,则每个点是由三个字节分别表示R/G...原创 2020-03-12 20:58:30 · 8438 阅读 · 2 评论