0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

你有遇到过像我这样理解C语言的吗?

巧学模电数电单片机 来源:巧学模电数电单片机 作者:巧学模电数电单片 2022-11-24 14:20 次阅读

今天我讲一下我个人对C语言的认识以及自己的理解,若有错误,还望指出,不甚感激。

首先是C语言整体的脉络,C语言包括哪些东西?哪些部分需要着重理解?这是我经常问自己的两个问题。

01 基础性知识

最基本的一些数据类型及其所占用的内存大小,还有一些基础的计算机常识,比如进制转换等,这些东西在对C语言有了一定的了解后都是比较容易的。

02 三种逻辑:顺序、选择和循环

顺序语句:就是从上到下没有判断,一步到底的语句。

选择语句:就是if和switch语句,在特定的场合,switch语句使用会使程序看的简单明了,尤其是选择情况较多的时候,大多数时候if语句用的多一点。

循环语句:就是while、do...while和for语句。

while语句和for语句用的场合非常多,我说一下几个注意点:

在多层循环中,尽可能把最长的循环放在最外围,节省cpu的资源。

不能在循环体内修改循环变量,防止循环失控。

循环尽可能的短,太多行的循环代码会大大的影响阅读。解决方法:使用子函数处理。

把循环嵌套控制在3层以内,超过三层,对代码的理解难度大大增加了。

for语句的控制表达式不能包含任何浮点类型的对象。

还有就是break和continue语句,经常会有人问我,这两个关键字跳出的是什么?

break是跳出离它最近的一个循环,switch中的是跳出switch,不是跳出循环,continue也是一样。

03 数组和指针

数组我把它分为两个:普通数组和字符串。

其中对字符串的操作就是C语言考核的最关键的一步,因为其涉及到了数组和指针,把字符串操作的很牛的人,他们对指针的理解一定很深。

普通数组:一维数组的内容不是太多,但是对算法的要求比较高,最基础的是一定要会冒泡和选择排序,这两种算法最基础,但也是在排序上用的最多的。

如果会更好的算法的话另外谈,有兴趣的话可以对算法这一块深入研究。

二维数组的话,要理解其内存的分配情况,元素的存放顺序,会对二维数组进行输入输出,其他的就是算法了,以后慢慢去研究去。

字符串:字符串这部分的话,因为C语言对字符串的操作不像c++那么容易,所以,要对指针和数组这块下一点功夫。

最简单的就是将string.h库函数中的strlen、strcmp、strcpy、strncmp这几个函数自己实现一篇,使用指针的方式。

指针:当初老师讲指针的时候,说了一句,如果你把指针学会了,C语言你就掌握了70%。

当初我还有些怀疑,现在的我十分赞同这句话。

指针就是C语言的精华所在,C语言是一门软硬通吃的语言,归根到底就是这个指针的知识,他能直接操控底层。

关于指针,我印象最深的是那个例子,*p 把p想象成小明家的门牌号,而*则是一把万能钥匙,*p代表的值就是小明本人,你可以把小明家的地址给别人,别人拿着*(万能钥匙)和p(小明家门牌号)就能去看小明本人,可以对小明本人进行操作。

这个例子当时给我的印象非常深,那以后我感觉我对指针的理解顿时清楚了很多,非常感谢我的C语言启蒙老师,有了他的带领,我才能对C语言有深一步的理解。

04 函数

函数的话,我感觉就是main函数的一个延伸,但它是可重复调用的,你可以把一些繁杂的步骤写到一个函数里面,这样main函数才不会显得太臃肿。

函数最重要的就是它的格式,返回值+函数名+(形参)+函数体,其中有一个容易忽视的点就是,当形参是一个指针的时候,在函数开始时,要进行入口参数检查,就是对指针是否为空进行判断,要不然容易出现段错误。

还有一个就是,如果一个函数在main函数下面,最好进行一下声明,虽说现在的编译器已经帮我们省略了这一步骤,但我们还是要养成良好的习惯,毕竟如果给你一个旧版本的编译器的话,就会报错。

编译器的优化并不是我们偷懒的理由,不过我们也可以将函数写在main函数上方,这样的话就不需要考虑这个问题了。

05 关键字

Static全局变量:作用范围局限于源文件,不可被源文件的其他文件使用。

局部变量:局限于特定函数,出作用域不释放,函数结束后依然存在。

函数:作用范围局限于源文件,不可被源文件的其他文件使用 函数名在其它文件不可见。

const:这个关键字其实只要记住一局诗:近水楼台先得月!最靠近const的那个就是不能变的。

extern:这个关键字一般是用在.h头文件中,声明函数,不是本文件中的。

struct:结构体,包含多种数据类型的变量,在数据结构中经常用到,比如说:链表、栈和队列等。

enum枚举:和define的功能差不多,枚举和宏其实非常类似,宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。

union共用体:和结构体的结构差不多,但是结构体的各个成员会占用不同的内存,互相之间没有影响。

而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员,一般用来测试系统的大小端。

到这边,C语言的内容其实就差不多了,除了其他一些零零碎碎的小知识点。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128595
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61309
  • 变量
    +关注

    关注

    0

    文章

    595

    浏览量

    28112

原文标题:学生时代,你有遇到过像我这样理解C语言的吗?

文章出处:【微信号:巧学模电数电单片机,微信公众号:巧学模电数电单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    关于STM32CubeMX FatFs遇到的问题求解

    () 和 osSemaphoreWait()函数, 这两个函数在CMSIS V1 中有定义,但我在CubeMX中选择CMSIS V2 为啥syscall.c 中还是使用了 v1 的函数,有没有人遇到过,望能指点一下。 感谢!
    发表于 04-09 07:39

    STM32WL55JC例程代码中的APP_LOG()是否能理解为串口打印?

    看历程带代码时看到这个函数,以前都没遇到过 时否可以理解为串口打印
    发表于 03-13 08:07

    CY7C68013A-56BAXC FPGA运行2,3分钟后上位机卡死了怎么解决?

    请问一下是否遇到过这样一个问题,FPGA运行2,3分钟后上位机卡死了。频率用的48M,每包512Byte。这种情况下该如何去排除问题。
    发表于 02-27 08:00

    HIGHTEC创建工程导入iLLD遇到的疑问求解

    IFX_INTERRUPT_INTERNAL#define IFX_INTERRUPT_INTERNAL(isr, vectabNum, prio) 遇到过的吗?主要是那一段汇编引起的
    发表于 02-05 08:00

    芯片烧坏时发生了什么?为什么总是VDD短路?甚至封装开裂冒烟?

    相信大家在MCU调试和生产测试阶段遇到过这样的情况,芯片发烫不工作,甚至芯片冒起一阵青烟
    的头像 发表于 01-19 10:34 954次阅读
    芯片烧坏时发生了什么?为什么总是VDD短路?甚至封装开裂冒烟?

    defer的这些坑,你遇到过吗?

    结论:延迟函数 fmt.Println(a) 的参数在 defer 语句出现的时候就已经确定下来了,所以不管后面如何修改 a 变量,都不会影响延迟函数
    的头像 发表于 12-01 09:28 208次阅读

    通过电路符号认知N沟道和P沟道MOSFET的工作原理

    硬件面试中有遇到过这样的事吗?通常让你画一个增强型的MOSFET,或是N沟道MOSFET或是P沟道MOSFET
    的头像 发表于 11-21 15:05 1026次阅读
    通过电路符号认知N沟道和P沟道MOSFET的工作原理

    请问各位在0使用M0外部晶振时遇到过频率偏低的问题吗?

    请问各位在0使用M0外部晶振时遇到过频率偏低的问题吗?我在最近遇到了使用36MHz晶振时有大约3.3%的片子频率偏低,在2013年8月还遇到过一次,换了晶振和电阻电容都不管用,只有换了M0片子才管用,难道M0震荡部分有缺陷?
    发表于 08-24 06:56

    300MPI以太网模块西门子plc300以太网组态

    你是否曾经遇到过这样的问题:如何实现西门子PLC与第三方上位机软件的通信?今天我们将为大家揭开这个谜团。
    的头像 发表于 08-01 17:01 557次阅读
    300MPI以太网模块西门子plc300以太网组态

    RS485/RS232自由转ETHERNET/IP网关什么是EtherNet/IP?

    你是否曾经遇到过这样的问题:如何将ETHERNET/IP网络和RS485/RS232总线连接起来呢?
    的头像 发表于 07-30 16:58 939次阅读
    RS485/RS232自由转ETHERNET/IP网关什么是EtherNet/IP?

    Profibus DP转Modbus TCP网关modbus tcp和modbusRTU的区别

    你是否曾经遇到过这样的问题:如何在不改变现有网络架构的情况下,将Profibus总线侧的从站接入以太网侧的ModbusTcp网络呢?
    的头像 发表于 07-27 17:10 473次阅读
    Profibus DP转Modbus TCP网关modbus tcp和modbusRTU的区别

    RS232自由转Profinet网关扫码枪连接plc程序

    你是否曾经遇到过这样的问题:如何在不编写复杂代码的情况下,将条形码数据上传到PLC?今天,我们将为你揭示一个简单的解决方案!
    的头像 发表于 07-25 09:00 449次阅读
    RS232自由转Profinet网关扫码枪连接plc程序

    MODBUS TCP转CCLINK IE协议网关如何转换不同协议

    你是否曾经遇到过需要将不同的设备连接到一个统一的网络中?或者你是否曾经遇到过设备之间的通讯协议不兼容的问题?远创智控的YC-CCLKIE-TCP通讯网关就是为解决这些问题而设计的。
    的头像 发表于 07-21 14:41 266次阅读
    MODBUS TCP转CCLINK IE协议网关如何转换不同协议

    RS232自由转Profinet网关rs232转网线

    你是否曾经遇到过这样的问题:如何在不编写复杂代码的情况下,将条形码数据上传到PLC?今天,我们将为你揭示一个简单的解决方案!
    的头像 发表于 07-21 09:10 297次阅读
    RS232自由转Profinet网关rs232转网线

    第62集(12.2#100)).c 文件与.h 文件的同名冲突,遇到过这种问题吗?

    嵌入式C语言
    于振南的单片机世界
    发布于 :2023年06月07日 22:07:25