![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C语言
文章平均质量分 51
C语言进阶教程,干货满满
勇往直前的进击
明日复明日,明日何其多。
我生待明日,万事成蹉跎 。
展开
-
C语言进阶第48式:函数设计原则
函数设计原则函数从意义上应该是一个独立的功能模块;函数名要在一定程度上反映函数的功能;函数参数名要能够体现参数的意义;尽量避免在函数中使用全局变量;当函数参数不应该在函数体内部被修改时,应加上 const声明;如果参数是指针,且仅作输入参数,则应加上 const声明;不能省略返回值的类型–如果函数没有返回值,那么应声明为void类型;对参数进行有效性检查–对于指针参数的检查尤为重要;不要返回指向“栈内存”的指针–栈内存在函数体结束时被自动释放;函数体的规模要小,.原创 2022-04-21 16:10:04 · 655 阅读 · 0 评论 -
C语言进阶第47式:递归函数分析
递归的数学思想递归是一种数学上分而自治的思想递归需要有边界条件一当边界条件不满足时,递归继续进行;一当边界条件满足时,递归停止;递归函数函数体内部可以调用自己递归函数-函数体中存在自我调用的函数;递归函数是递归的数学思想在程序设计中的应用-递归函数必须有递归出口;-函数的无限递归将导致程序栈溢出而崩溃;递归模型的一般表示法递归函数设计示例一:用递归的方法编写函数求字符串长度递归版strlen#include <stdio.h>.原创 2022-04-21 15:59:34 · 173 阅读 · 0 评论 -
C语言进阶第46式:函数与宏分析
函数与宏宏是由预处理器直接替换展开的,编译器不知道宏的存在;函数是由编译器直接编译的实体,调用行为由编译器决定;多次使用宏会导致最终可执行程序的体积增大;函数是跳转执行的,内存中只有一份函数体存在;宏的效率比函数要高,因为是直接展开,无调用开销;函数调用时会创建活动记录,效率不如宏;函数与宏,示例如下#include <stdio.h>#define RESET(p, len) \ while( len > 0 ) .原创 2022-04-21 15:45:34 · 173 阅读 · 0 评论 -
C语言进阶第45式:函数参数的秘密(下)
函数参数的秘密原创 2022-04-21 15:36:58 · 163 阅读 · 0 评论 -
C语言进阶第44式:函数参数的秘密(上)
函数参数函数参数在本质上与局部变量相同在栈上分配空间;函数参数的初始值是函数调用时的实参值;函数参数的求值顺序依赖于编译器的实现示例如下#include <stdio.h>int func(int i, int j){ printf("%d, %d\n", i, j); return 0;}int main(){ int k = 1; func(k++, k++); printf(原创 2022-04-21 15:21:29 · 198 阅读 · 0 评论 -
C语言进阶第43式:函数的意义
C语言中的函数函数的由来模块化程序设计C语言中的模块化面向过程的程序设计面向过程是一种以过程为中心的编程思想;首先将复杂的问题分解为一个个容易解决的问题;分解过后的问题可以按照步骤一步步完成;函数是面向过程在C语言中的体现;解决问题的每个步骤可以用函数来实现;声明和定义声明的意义在于告诉编译器程序单元的存在;定义则明确指示程序单元的意义;C语言中通过extern进行程序单元的声明;一些程序单元在声明时可以省略extern..原创 2022-04-21 13:53:50 · 157 阅读 · 0 评论 -
C语言进阶第42式:内存操作经典问题分析二
常见内存错误结构体成员指针未初始化;结构体成员指针未分配足够的内存;内存分配成功,但并未初始化;内存操作越界;示例1如下#include <stdio.h>#include <malloc.h>void test(int* p, int size){ int i = 0; for(i=0; i<size; i++) { printf("%d\n", p[i]); } free原创 2022-04-21 13:36:35 · 849 阅读 · 0 评论 -
C语言进阶第41式:内存操作经典问题分析一
野指针指针变量中的值是非法的内存地址,进而形成野指针;野指针不是 NULL 指针,是指向不可用内存地址的指针;NULL 指针并无危害,很好判断,也很好调式;C语言中无法判断一个指针所保存的地址是否合法;野指针的由来局部指针变量没有被初始化;指针所指向的变量在指针之前被销毁;使用已经释放过的指针;进行了错误的指针运算;进行了错误的强制类型转换;示例如下#include <stdio.h>#include <malloc.h>int m原创 2022-04-21 13:30:04 · 151 阅读 · 0 评论 -
C语言进阶第40式:程序的内存布局
程序的内存布局原创 2022-04-21 00:02:52 · 931 阅读 · 0 评论 -
C语言进阶第39式:程序中的三国天下
栈,堆和静态存储区是程序中的三个基本数据区一栈区主要用于函数调用的使用一维区主要是用于内存的动态申请和归还一静态存储区用于保存全局变量和静态变量原创 2022-04-20 21:45:37 · 181 阅读 · 0 评论 -
C语言进阶第38式:动态内存分配
动态内存分配的意义C语言中的一切操作都是基于内存的;变量和数组都是内存的别名:一内存分配由编译器在编译期间决定;一定义数组的时候必须指定数组长度;一数组长度是在编译期就必须确定的;malloc和free 用于执行动态内存分配和释放malloc 和 freemalloc所分配的是一块连续的内存;malloc以字节为单位,并且不带任何的类型信息;free用于将动态内存归还系统;void* malloc(size_t size);void free(void* po原创 2022-04-20 21:30:28 · 149 阅读 · 0 评论 -
C语言进阶第37式:指针阅读技巧分析
指针阅读技巧解析一从最里层的圆括号中未定义的标示符看起;一首先往右看,再往左看;一遇到圆括号或方括号时可以确定部分类型,并调转方向;一重复2,3步骤,直到阅读结束;#include <stdio.h>int main(){ int (*p1)(int*, int (*f)(int*)); int (*p2[5])(int*); int (*(*p3)[5])(int*); int*(*(*p4)(int*))(in..原创 2022-04-20 21:18:55 · 461 阅读 · 0 评论 -
C语言进阶第36式:函数与指针分析
函数类型C语言中的函数有自己特定的类型函数的类型由返回值,参数类型和参数个数共同决定int add(int i, int j)的类型为int(int, int)C语言中通过typedef为函数类型重命名typedef type name(parameter list)例如:typedef int f(int, int);typedef void p(int);函数指针函数指针用于指向一个函数;函数名是执行函数体的入口地址;可通过函数类型定义函数指针: FuncType原创 2022-04-20 21:14:51 · 153 阅读 · 0 评论 -
C语言进阶第35式:数组参数和指针参数分析
为什么C语言中的数组参数会退化为指针?退化的意义C语言中只会以值拷贝的方式传递参数;当向函数传递数组时:将整个数组拷贝一份传入函数;将数组名看做常量指针传数组首元素地址;C语言以高效作为最初设计目标:a)参数传递的时候如果拷贝整个数组执行效率将大大下降。b)参数位于栈上,太大的数组拷贝将导致栈溢出。二维数组参数二维数组参数同样存在退化的问题-二维数组可以看做是一维数组-二维数组中的每个元素是一维数组二维数组参数中第一维的参数可以省略void f(i...原创 2022-04-20 21:03:53 · 124 阅读 · 0 评论 -
C语言进阶第34式:多维数组和多维指针
指向指针的指针指针的本质是变量;指针会占用一定的内存空间;可以定义指针的指针来保存指针变量的地址值;为什么需要指向指针的指针?指针在本质上也是变量;对于指针也同样存在传值调用与传址调用;示例如下#include <stdio.h>#include <malloc.h>int reset(char**p, int size, int new_size){ int ret = 1; in...原创 2022-04-20 19:15:48 · 129 阅读 · 0 评论 -
C语言进阶第33式:main函数与命令行参数
下面的main函数定义正确吗?main函数的概念C语言中main函数称之为主函数;一个C程序是从main函数开始执行的;int main(){ return 0;}main函数的本质main函数是操作系统调用的函数;操作系统总是将main函数作为应用程序的开始;操作系统将main函数的返回值作为程序的退出状态;#include <stdio.h>int main(){ printf("I'm A!\n"); re..原创 2022-04-20 19:04:51 · 235 阅读 · 0 评论 -
C语言进阶第32式:数组指针和指针数组分析
数组指针和指针数组分析原创 2022-04-20 15:39:34 · 143 阅读 · 0 评论 -
C语言进阶第31式:字符串典型问题分析
下面的程序输出什么?为什么?#include <stdio.h>int main(){ char buf[10] = {0}; char src[] = "hello %s"; snprintf(buf, sizeof(buf), src); printf("buf = %s\n", buf); return 0;}分析snprintf 函数本身是可变参数函数,原型如下:int snprintf(原创 2022-04-20 15:25:58 · 111 阅读 · 0 评论 -
C语言进阶第30式:C语言中的字符串
字符串的概念字符数组与字符串...原创 2022-04-20 11:04:04 · 445 阅读 · 0 评论 -
C语言进阶第28式:指针和数组分析(下)
数组名可以当作常量指针使用,那么指针是否也可以当作数组名来使用呢?数组的访问方式以下标的形式访问数组中的元素int main(){ int a[5]= {0}; a[1]= 3; a[2] = 5; return 0;}以指针的形式访问数组中的元素int main(){ int a[5]= {0}; *(a+ 1)= 3; *(a+ 2)= 5; return 0;}指针以固定增量在数组中移动原创 2022-04-19 23:16:35 · 119 阅读 · 0 评论 -
C语言进阶第28式:指针和数组分析(上)
数组的本质数组是一段连续的内存空间;数组的空间大小为sizeof(array_type)* array_size;数组名可看做指向数组第一个元素的常量指针;示例1如下:#include <stdio.h>int main(){ int a[5] = {0}; int* p = NULL; printf("a = 0x%X\n", (unsigned int)(a)); printf("a +...原创 2022-04-19 14:32:14 · 124 阅读 · 0 评论 -
C语言进阶第27式:数组的本质分析
数组是相同类型的变量的有序集合;数组示意图:数组包含5个int类型的数据数组的大小数组在一片连续的内存空间中存储元素;数组元素的个数可以显示或隐式指定;示例1如下:int a[5] = {1,2};int b[] = {1,2};示例1如下:#include <stdio.h>int main(){ int a[5] = {1, 2}; int b[] = {1, 2}; printf("a[2] = %d\n原创 2022-04-19 14:11:17 · 155 阅读 · 0 评论 -
C语言进阶第26式:指针的本质分析
程序中的变量只是一段存储空间的别名,那么是不是必须通过这个别名才能使用这段存储空间?* 号的意义在指针声明时,*号表示所声明的变量为指针在指针使用时,*号表示取指针所指向的内存空间中的值示例1如下:#include <stdio.h>int main(){ int i = 0; int* pI; char* pC; float* pF; pI = &...原创 2022-04-19 13:57:30 · 186 阅读 · 0 评论 -
C语言进阶第25式:# 和 ## 操作符使用分析
# 和 ## 操作符使用分析原创 2022-04-19 10:04:45 · 143 阅读 · 0 评论 -
C语言进阶第24式:#pragma 使用分析
#pragma的作用和用法原创 2022-04-18 11:34:15 · 225 阅读 · 0 评论 -
C语言进阶第23式:#error和#line的使用分析
#error和#line的使用分析原创 2022-04-16 20:00:16 · 528 阅读 · 0 评论 -
C语言进阶第22式:条件编译使用分析
条件编译的本质与意义原创 2022-04-16 19:30:33 · 382 阅读 · 0 评论 -
STM32CubeMX安装教程
STM32CubeMX是STM32芯片图形化配置工具,通过简单的操作便能实现相关配置,省去了我们配置各种外设的时间,支持MDK、IAR For ARM、TrueStudio等多种工具。安装CubeMX分三步: JRE(Java Runtime Environment) STM32CubeMX STM32的HAL固件库 这三部分资料可以在网盘上下载,链接及提取码如下:链接:https://pan.baidu.com/s/1I-QRA4Cm...原创 2021-07-23 22:01:02 · 1683 阅读 · 1 评论 -
如果编程语言是一门武功绝学,那么汇编、C语言······(转载)
学习编程与武功绝学武侠小说中,各路侠客绿林好汉都是从基本功开始一招一式学起,掌握了足够多的招式后,加之勤学苦练,量变引起质变,会有一天打开任督二脉顿悟出这些招式背后的哲学逻辑,成为一代宗师。在编程的学习过程中,我们何尝不是从一招一式的函数、语法、特性等学起,掌握了一门编程语言后,再学习另一门语言就会快很多,如同拥有内功后,习得其他武功也会轻松很多。如果编程语言是一门武功绝学,各语言分别是哪门武功绝学呢?汇编语言汇编语言 - 易筋经汇编语言是计算机提供给用户的最快最有效的语言,也是能够利用原创 2021-07-25 16:11:15 · 382 阅读 · 0 评论 -
C 语言#if、#elif、#ifdef的灵活秒用
有时候出于对程序代码优化的考虑.希望只对其中一部分内容进行编译。此时就需要在程序中加上条件,让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,这就是条件编译。常见的预编译指令如下: #define 定义一个预处理宏 #undef 取消宏的定义 #if 编译预处理中的条件命令,相当于C语法中的if语句 #ifdef 判断某个宏是否被定义,若原创 2021-07-26 23:01:43 · 1037 阅读 · 0 评论 -
嵌入式开发中的C语言知识点
嵌入式开发中的C语言知识点1、关键字2、数据类型3、内存管理和存储架构4、指针和数组5、结构类型和对齐6、预处理机制1、关键字几乎每一门语言中都有关键字,具有特殊功能,C语言也不例外,按照功能可分为: 数据类型(常用char, short, int, long, unsigned, float, double) 运算和表达式(=, +, -, *, while, do-while, if, goto, switch-case) 数据...原创 2021-07-23 21:22:32 · 753 阅读 · 0 评论 -
C语言常见问题
1、嵌入式与单片机的区别从软件上,行业里经常把芯片中不带MMU(Memory Management Unit内存管理单元)从而不支持虚拟地址,只能裸奔或运行RTOS(实时操作系统,例如ucos、华为LiteOS、RT-Thread、FreeRTOS)的system,叫做单片机(例如STM32、NXP)而把芯片自带MMU可以支持虚拟地址,能够跑Linux、Vxworks、WinCE、Android这样的“高级”的system,叫做嵌入式2、Heap(堆)和Stack(栈)的区别Hea...原创 2021-02-15 21:44:15 · 280 阅读 · 0 评论 -
C语言常用的几个工具函数
1、字符串转十六进制代码实现:void StrToHex(char *pbDest, char *pbSrc, int nLen){ char h1,h2; char s1,s2; int i; for (i=0; i<nLen/2; i++) { h1 = pbSrc[2*i]; h2 = pbSrc[2*i+1]; s1 = toupper(h1) - 0x30; //toupper 转换为大写字母原创 2021-07-23 21:45:22 · 542 阅读 · 3 评论 -
C语言实现环形队列的原理和方法
什么是环形队列?环形缓冲区是一个非常典型的数据结构,这种数据结构符合生产者,消费者模型,可以理解它是一个水坑,生产者不断的往里面灌水,消费者就不断的从里面取出水。那就可能会有人问,既然需要灌水,又需要取出水,为什么还需要开辟一个缓冲区内存空间呢?直接把生产者水管的尾部接到消费者水管的头部不就好了,这样可以省空间啊。答案是不行的,生产者生产水的速度是不知道的,消费者消费水的速度也是不知道的,如果你强制接在一起,因为生产和消费的速度不同,就非常可能存在水管爆炸的情况,你说这样原创 2021-07-26 22:58:40 · 906 阅读 · 1 评论 -
用C语言实例描述程序中的内聚和耦合
编程时,我们讲究的是高内聚低耦合,在协同开发、代码移植、维护等环节都起到很重要的作用。一、原理篇而低耦合,是指模块之间尽可能的使其独立存在,模块之间不产生联系不可能,但模块与模块之间的接口应该尽量少而简单。这样,高内聚从整个程序中每一个模块的内部特征角度,低耦合从程序中各个模块之间的关联关系角度,对我们的设计提出了要求。程序设计和软件工程发展过程中产生的很多技术、设计原则,都可以从内聚和耦合的角度进行解读。作为C语言程序设计的初学者,结合当前对于函数的理解可达到的程度,我们探讨一下如何做到高内聚原创 2021-10-14 10:53:54 · 325 阅读 · 0 评论 -
嵌入式开发为什么选择C语言
从语言特点来说 C语言有出色的可移植性,能在多种不同体系结构的软/硬平台上运行。 简洁紧凑,使用灵活的语法机制,并能直接访问硬件能够直接访问硬件的语言有:汇编和C语言汇编属于低级语言,难以完成一些复杂的功能,但是汇编比C语言访问硬件的效率更高。所以,一般将硬件初始化的工作交给汇编,比较复杂的操作交给C语言。 C语言具有很高的运行效率。 高级语言中的低级语言:面向过程VS面向对象面向过程“面向过程”(Procedure Oriented)是一种以过程为中心的编程思...原创 2021-07-26 22:36:00 · 150 阅读 · 0 评论 -
嵌入式技术面试时的“10大潜规则“
找工作也是一门技能,有的人很快就找到自己喜欢的工作,有的人找了很久也没找到合适的工作。下面给大家分享几点找工作过程中存在的“潜规则”内容。嵌入式专栏1面试的本质不是考试,而是告诉面试官你会做什么经验不够的小伙伴特别容易犯的一个错误,不清楚面试官到底想问什么,其实整个面试中面试官并没有想难倒你的意思,只是想通过提问的方式来知道你会什么。比如STM32单片机的代码从哪里开始执行?没入门的说从main函数开始,大佬会从上电启动开始。围绕着一个话题只要你能在某一方面回原创 2021-07-26 23:15:32 · 476 阅读 · 1 评论 -
C语言进阶第21式:宏定义与使用分析
C语言中的宏定义原创 2022-04-16 18:48:03 · 494 阅读 · 0 评论 -
C语言进阶第20式:链接过程简介
链接器的意义静态链接动态链接原创 2021-08-22 22:23:47 · 231 阅读 · 0 评论 -
C语言进阶第19式:编译过程简介
什么是编译?编译过程分为哪几个过程?原创 2021-08-22 22:11:50 · 126 阅读 · 0 评论