嵌入式学习经历(三)C基础小结


前言

在完成了环境搭建后,接下来的学习是最基础的高级语言学习-C语言,它在高校的学习中也属于是初学者的入门语言,想必各位对其并不陌生。本文主要内容是笔者在学习C语言中遇到的需要注意的点。


一、C语言固定关键字

关键字就是编译器已经规定好的一些有特殊含义的单词,我们直接使用即可。C语言是严格区分大小写的,关键字都是小写的,在编写时尽量避开使用关键字做为变量名以避免报错。下面给出一些常见的关键字

char short int long float double void struct enum union signed unsigned
auto const static extern register volatile
typedef
sizeof
if else switch case default while do for goto break continue return

二、程序运行步骤

将程序从代码(.C文件)变成可执行文件一般是通过4个步骤:预处理–>编译–>汇编–>链接

预处理:头文件的展开、注释的删除、宏定义的替换
gcc -E xxx.c -o xxx.i
编译:词法分析、语法分析 用来查错的
如果无误,会生成汇编文件
gcc -S xxx.i -o xxx.s
汇编:将汇编文件生成二进制文件
gcc -c xxx.s -o xxx.o
链接:链接库文件 生成最终的可执行文件
gcc xxx.o -o a.out
我们常用的Linux编译通常直接使用gcc 文件名就可以了,直接可以生成可执行文件,默认为 a.out
想改变可执行文件名则可在gcc命令后添加 -o 文件名即可

三、常见数据类型所占用空间大小

基本类型:整型、浮点型、枚举类型、
构造类型:数组、结构体、共用体
指针类型
空类型:void
整数类型又可以细分为 char(1字节=8bit)short(2字节=16bit)
int(4字节) long(32-4字节,64-8字节) 和 long long(8字节)
每种类型又分为 有符号(signed) 和 无符号(unsigned)
不写有无符号时,默认都是有符号的。

四、运算符注意点

部分逻辑判断运算符(例如与(&&)或(||)相等(==)不等于(!=)需要两个符号来表达,还有一些其他的运算符需要用两个符号来表达

  • 自增自减(++/–)
  • 三目运算符(表达式1?表达式2:表达式3;先执行表达式1,如果表达式1为真则执行表达式2,否则执行表达式3,和if…else 语句的逻辑很类似)
  • 位移(<</>>)

部分单个符号一般在程序中表达为计算

  • &:两个二进制数按位与计算,见0为0,全1为1
  • |:两个二进制数按位或计算,有1为1
  • =:一般表现为给变量赋值

五、程序控制语句注意点

C语言中我们常用的控制语句一般为if…else、switch、for/while循环,接下来为大家逐条讲解一下注意点

  • if…else在逻辑较为复杂的情况一般会嵌套使用,在许多情况下会放入循环中;if…else在使用时如果下面只有一条语句是可以不使用大括号的,在阅读代码时要注意不能将代码所属地搞错;在写条件判断时要将优先判断的情况写到代码的前方,这样会减少出现符合逻辑但不出现对应结果的情况。
  • Switch
    1.switch后面()里的表达式可以是变量,也可以是一个完整表达式,一般情况下,结果需要是 整型的 或者字符的(不能是浮点型的)
    2.case后面的常量表达式就是switch后面()中表达式可能的结果
    3.break的作用是执行完某个分支的代码块就立即结束整个switch…case语句
    如果不加 break,程序会继续向下执行下面case的代码块,直到遇到break或者整个switch…case语句结束,这种现象叫做—“case击穿”,case击穿在部分情况是可以利用的,可以省去一些判断过程
    4.default 分支相当于 if…else 语句中的else部分,如果前面的case都不满足,则执行default分支
    如果不关心其他分支的情况,整个default分支都可以不要
  • while
    while语句个人很喜欢使用,在边界不明的情况下是一个很好的选择,在while后的()中写出运行条件,内部程序逻辑全部由自己填写,寻找问题也很方便。与之相对应的dowhile结构和while的区别就是do处的循环至少会执行一次,然后再进行条件判断,其余与while相同
  • for
    for循环在循环边界清晰时编写逻辑较为轻松,在多次嵌套循环中也有不错的使用场景
    关于for的3个表达式:表达式1:只执行1次,一般是用来给循环变量赋初值的。但是新定义的变量生命周期和作用域只有当前的for循环的{}内部;
    表达式2:和前面while循环的表达式一样,一般是用来判断真假的;
    表达式3:一般是用来改变循环变量的值从而确定循环结束条件的。
  • 部分情况下需要死循环,例如需要设备实时接收信号,在设备打开时一直接收来自别的设备的信号,及时反馈到自身设备。
  • 关于数组与循环:数组在计算机中的存储是连续的,要注意存储边界的问题,若发生数组越界
    ,编译器有时不会报错,但可能会修改不该修改的数据。

六、指针注意点

  • 定义

内存中每个字节都有一个编号,这个编号就是指针变量存储的内容,叫作地址,通过& 可以获取变量的地址。
专门用来存储这个编号的变量,叫做指针变量不过我们通常简化叫做指针,指针只能保存已经分配了的地址,我们使用 %p 输出地址。

  • 运算
    指针的减法:两个指针变量做差 得到的结果是相差的数据类型的个数,而不是相差多少个字节
    指针加上一个整数n 表示 :加上n个指针的数据类型的大小
  • const关键字
    const 修饰变量时,表示不能通过变量名,来修改变量的值。const在不同位置时修饰的变量会有不同。
    区分时要看 const 和 的相对位置关系
    const 在 * 的左边,表示修饰的是
    p
    表示不能通过指针p修改指向的空间里的内容 指针的指向是可以修改的
    const 在 * 的右边,表示修饰的是 p
    表示允许通过指针p修改指向的空间里的内容 指针的指向是不可以修改的
    如果*的左右都有const 表示都不能修改了
  • 指针传递字符串/数组
    C语言中传递数组时通常使用指针,指针一般传递的是数组的首地址,通过首地址在函数内通过操作数组的方式来处理数据。
  • 函数指针
    本质是一个指针,指向一个函数。函数指针指向函数之后 就可以通过函数指针来调用函数了。函数指针最常见的应用就是回调函数。而所谓的回调函数,是将函数指针作为某个函数的形参,在函数中通过函数指针调用函数时,具体调用的是哪个函数,取决于这个函数的调用者给函数指针传递的具体参数,传的是什么,就回过头去调用什么功能,所以叫做回调函数。

七、其他注意点(后续视情况更新)

  • main函数的调用
    int argc的含义是传给main函数的参数个数,const char *argv[]是包括可执行文件名在内预备传给main函数的一个数据集合,每个参数在其中以字符串的形式存储,调用时可以根据字符数组的规则进行相应操作。

总结

以上就是C语言学习过程中我认为有必要加深记忆的内容,本文仅仅简单介绍了c语言的基础部分,学习编程语言除去理论知识外还需要更多的实际操作练习,不断解决自己遇到的问题才能有真正的提升,笔者在此与诸位共勉,希望能够共同学习,一起进步。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值