C
文章平均质量分 91
C语言、编译、链接、静态库、动态库......
_npc_
仰望星空,脚踏实地
展开
-
【Windows & Esp32】基于 libjpeg-9e 编解码库的视频播放器
音视频播放器原创 2023-01-27 23:29:24 · 3946 阅读 · 4 评论 -
【Arduino & Esp32】SD卡读写
SD卡读写原创 2022-10-24 15:59:06 · 7145 阅读 · 1 评论 -
【C语言】变长数组、函数与数组、GCC对C的扩展、变长数组的实现原理
变长数组使用与原理原创 2022-08-14 17:49:46 · 1938 阅读 · 1 评论 -
【Arduino + Linux】基于 Helix 解码库实现 MP3 音频播放
目录一、MP3 文件结构二、MP3 解码库MP3(Moving Picture Experts Group Audio Layer III,MPEG Audio Layer 3),本身是一种音频编码方式,MPEG 音频文件是 MPEG 标准中的声音部分,根据 压缩质量 和 编码复杂程度 划分为三层,即Layer-1、Layer-2、Layer-3,分别对应MP1、MP2、MP3 这三种声音文件,层次越高,编码器越复杂,压缩率也越高,MP3 压缩率可达到 10:1 至 12:1。MP3 是利用人耳对高频原创 2022-03-17 13:06:17 · 8173 阅读 · 6 评论 -
【Arduino + Linux】基于NodeMCU32实现WAV音频播放
目录一、Arduino环境配置二、音频数据收发2.1、服务器程序2.2、客户端程序三、编写音频驱动3.1、音频基础知识3.2、WAV格式认识3.3、mp3转WAV3.4、硬件连接3.5、I2S使用内部DAC注意事项NodeMCU32S是基于ESP-WROOM-32模块开发的,其内部存储资源比较紧缺,该模块集成 4MB 外部FLASH,但是对于 wav 格式的音频而言是远远不够的,又因为该模块具有比较成熟的无线通信技术,所以就有一个想法:将音乐文件保存到服务器上,NodeMCU32 通过 WiFi 通讯方式原创 2022-01-07 00:12:09 · 3617 阅读 · 2 评论 -
【C语言】强符号与弱符号
目录一、先说结论二、当attribute修饰符号的引用/声明时——不做链接2.1、变量声明2.2、函数声明三、链接.o文件3.1、函数3.1.1、多个强符号3.1.2、一个强符号多个弱符号3.1.3、多个弱符号3.2、变量3.2.1、多个强符号3.2.2、一个强符号多个弱符号3.2.2.1、全部的弱符号在.data中3.2.2.2、弱符号部分在.data中,部分在.common中3.2.2.3、全部的弱符号在.common中3.2.3、多个弱符号3.2.3.1、弱符号全部为在.data中3.2.3.2、弱符原创 2021-12-22 20:50:42 · 1897 阅读 · 0 评论 -
【C语言】可变参数原理与printf的实现
1、如何知道下一个参数占多少位?对于编译器生成32位可执行目标文件而言,从反汇编程序,调用可变函数时,实参为字符数据、短整形数据的大小小于4字节的数据时,会将其按4字节进行存储,4字节的按4字节的存储,8字节的按8字节存储,那在可变函数中如何知道是4字节还是8字节,还真不好判断,在printf的做法是通过第一个字符串参数中的 ’ l ’ 作为判断,如果有l那么,读取的时候按8字节读取。的可知va_arg...原创 2021-07-05 16:55:16 · 1620 阅读 · 3 评论 -
【ATT 与 Intel】汇编与C语言相互调用及内联汇编
目录一、ATT 与 Intel二、函数调用的约定三、C语言调用汇编程序四、汇编程序调用C语言五、内联汇编一、ATT 与 Intelx86架构的处理器的汇编指令一般使用有两种:ATT 汇编Intel 汇编常用的汇编器:MS VC 编译器:只支持 Intel 格式GNU CC 编译器:支持 ATT 格式和 Intel 格式,一般从 gcc 的上层开始调用像cc、ar 等工具。ATT 与 Intel 汇编代码格式区别如下:Intel 代码省略了指示大小的后缀。我们看到指令 push原创 2021-05-17 23:08:50 · 3529 阅读 · 19 评论 -
【C语言】0x1F<<11等于0还是0xF800 ?
1、左移运算符格式:a<<b将a这个数的各二进制位左移b位,要求b必须是非负整数,移动过程中,右边空出的位用0填补,高位左移溢出则舍弃该高位。2、右移运算符格式:a>>b将a这个数的各二进制位右移b位,要求b必须是非负整数,移到右端的低位被舍弃。其中,①对于无符号数,高位补0;②对于有符号数,如果采用算术移位,则空出部分用符号位填补,如果采用逻辑移位,则用0填补。b的值相对于32位系统,要求不能超过32位,如果超过了,编译的时候会产生一个警告。疑问:0x1F从字面上原创 2021-01-08 15:06:06 · 1635 阅读 · 0 评论 -
【C语言】指针变量运算操作
指针变量除了的8种基本操作,还可以使用关系运算符来比较指针。1、赋值赋值:可以把相同类型的地址赋给指针。 例如, 用数组名、 带地址运算符(&) 的变量名、 另一个指针进行赋值。注意, 地址应该和指针类型兼容。也就是说, 不能把double类型的地址赋给指向int的指针, 至少要避免不明智的类型转换。C99/C11已经强制不允许这样做。int a[6] = {0};int b =...原创 2020-03-31 21:15:47 · 2837 阅读 · 0 评论 -
【C语言】指定初始化器
目录一、数组的初始化器二、结构的初始化器三、初始化器的综合应用四、参考资料一、数组的初始化器C99 增加了一个新特性: 指定初始化器(designated initializer) 。 利用该特性可以初始化指定的数组元素。例如, 只初始化数组中的最后一个元素。 对于传统的C初始化语法, 必须初始化最后一个元素之前的所有元素,才能初始化它:int arr[6] = {0,0,0,0,0,212...原创 2020-03-31 14:48:57 · 2440 阅读 · 0 评论 -
浮点数:printf(“%d,%d,%f\n“,a,b,c)各输出控制符取值的起始地址
目录一、问题抛出二、printf如何打印的三、回到问题一、问题抛出先看第一个例子:1、若运行时从键盘上输入9876543210l,则该程序在gcc编译器下的输出结果是()int main(){ int a;float b,c; scanf("%2d%3f%4f",&a, &b, &c); printf("\na=%d,b=%d,c=%f\n",a,b,c);...原创 2020-03-28 23:02:16 · 2741 阅读 · 1 评论 -
【C语言】序列点和副作用
目录一、序列点和副作用二、举例说明2.1 完整表达式2.1 逗号运算符2.1 &&和||2.1 ?:C标准规定,在两个序列点之间,一个对象所保存的值最多只能被修改一次。C标准规定:两个序列点之间的执行顺序使任意的。当然这个任意是在不违背操作符优先级和结合特性的前提下的,这个规定的意义是为编译器的优化留下空间。程序通过序列点将程序分成若干句,程序按序列点的先后顺序,按序依次...原创 2020-02-19 19:00:55 · 1964 阅读 · 1 评论 -
【C语言】运算符以及++的注意事项
目录一、运算符1.1 优先级和结合律1.2 运算符优先级和结合律一览表二、关于++的注意事项1.1 为什么++的代码效率更高?1.2 ++的优先级1.3 一个语句中用太多递增运算符三、参考资料一、运算符1.1 优先级和结合律y = 6 * 12 + 5 * 20;当运算符共享一个运算对象时, 优先级决定了求值顺序。 乘法的优先级最高,所以先进行乘法运算。即,先进行两个乘法运算6 * 12和...原创 2020-02-18 20:06:29 · 2987 阅读 · 0 评论 -
【C语言】基本数据类型
基本数据类型一、整数二、浮点数三、字符C语言的数据类型根据其不同的特点,可以分为基本数据类型、构造类型和空类型。一、整数数据类型标识符比特数取值范围整型[signed] int32-2147483648~2147483647整型unsigned int320~4294967295短整型[signed] short [int]16-327...原创 2020-01-25 20:22:22 · 528 阅读 · 0 评论