第3章_嵌入式Linux_C语言基础

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第三章嵌入式LinuxC语言基础本章内容3.1预处理3.2C语言中的内存分配3.3程序的可移植性考虑3.4C和汇编的接口3.5ARMLinux内核常见数据结构3.1预处理定义:在进行编译的第一遍扫描(词法扫描和语法分析)之前所做的工作。特征:以#开头的命令分类:宏定义、文件包含、条件编译等。3.1.1预定义基本概念宏:在C语言源程序中允许用一个标识符来表示一串符号,称为宏。宏替换:预处理过程中,用宏定义中的符号串替换程序中的所有宏名。预定义的分类预定义预定义符号(c语言自带)宏定义符号(用户编写)无参数宏定义带参数宏定义3.1.2文件包含功能:将指定的文件插入该语句行位置。格式:#include文件名#include“文件名”区别:文件查找的路径不同。3.1.3条件编译功能:条件编译可以使程序按不同的条件编译不同的程序代码,从而产生不同的目标代码文件,对程序的移植和调试非常有帮助。3种形式:#ifdef标识符程序段1#else程序段2#endif#ifndef标识符程序段1#else程序段2#endif#if常量表达式程序段1#else程序段2#endif3.2C语言中的内存分配本节将介绍C语言程序中的内存分配的原理和方法。内存的使用是程序设计中需要考虑的重要因素之一。原因:系统内存是有限的,尤其是嵌入式系统中。内存分配直接影响程序的效率。3.2.1C语言程序所占内存分类一个由c语言程序占用的内存分为以下几个部分:(1)栈:编译器自动分配释放,存放函数的参数值、局部变量的值、返回地址等。(2)堆:由程序员动态分配和释放。若程序员不释放,程序结束时由操作系统回收。(3)数据段:存放全局变量、静态变量、常数。(4)代码段:存放程序代码。3.2.2堆和栈的区别1、申请方式2、申请后系统的响应3、申请大小的限制4、申请速度的限制5、堆和栈中的存储内容3.3程序的可移植性考虑3.3.1字长和数据类型3.3.2数据对齐3.3.3字节顺序3.4C和汇编的接口3.4.1内嵌汇编的语法3.4.2编译器优化介绍3.4.3C语言关键字volatile3.4.4memory描述符3.5ARMLinux内核常见数据结构3.5.1链表3.5.2树、二叉树、平衡树3.5.3哈希表2.3变量与常量•2.3.1变量的定义•2.3.2typedef•2.3.3常量定义2.3.1变量的定义•变量定义的基本形式是:说明符(一个或多个)变量或表达式列表基本类型关键字示例整型int、unsigned、short、longinta;unsignedlongb;浮点型float、doublefloata;doubleb;字符型char、unsignedchara;unsignedcharb;枚举类型enumenuma;指针类型数据类型*int*a,*b;char*c;2.3.1变量的定义•变量的作用域是由变量的标识符作用域所决定的。•(1)局部变量在函数内部定义的变量称为局部变量。局部变量仅能被定义该变量的模块内部的语句所访问。换言之,局部变量在自己的代码模块之外是不可见的。•(2)全局变量全局变量贯穿整个程序,它的作用域源文件,可被源文件中的任何一个函数使用。它们在整个程序执行期间保持有效。2.3.1变量的定义•变量的存储方式•变量的存储方式可分为静态存储和动态存储两种。•静态存储变量通常是在程序编译时就分配一定的存储空间并一直保持不变,直至整个程序结束。全局变量即属于此类存储方式。•动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放。2.3.2typedef•typedef是C语言的关键字,其作用是为一种数据类型定义一个新名字•基本用法如下所示:typedef数据类型自定义数据类型•例如:用户可以使用以下语句:typedefunsignedlonguint32;2.3.3常量定义•const定义常量•用法:•在定义时对它进行初始化constinta=10;•在函数中声明为const的形参在函数被调用时会得到实参的值•define定义常量•用法•#define符号名替换列表2.4运算符与表达式•2.4.1算术运算符和表达式•2.4.2赋值运算符和表达式•2.4.3逗号运算符和表达式•2.4.4位运算符和表达式•2.4.5关系运算符和表达式•2.4.6逻辑运算符和表达式•2.4.7sizeof操作符•2.4.8条件(?:)运算符•2.4.9运算符优先级总结2.4运算符与表达式运算符类型说明算术运算符+−*/%关系运算符====!=逻辑运算符!&&||位运算符^|&~赋值运算符=及其扩展赋值运算符条件运算符?:逗号运算符,指针运算符*&求字节数运算符Sizeof强制类型转换运算符(类型)分量运算符.→下标运算符[]其他如函数调用运算符()2.4.1算数运算符和表达式•算术运算符•算术运算符包括双目的加减乘除四则运算符和求模运算符,以及单目的正负运算符.运算符描述结合性+单目正从右至左−单目负从右至左*乘从左至右/除和整除从左至右%求模(求余)从左至右+双目加从左至右−双目减从左至右2.4.1算数运算符和表达式•算术表达式•用算术运算符和括号可以将操作数连接起来组成算术表达式。•例如:a+2*b-5、18/3*(2.5+8)-'a‘•混合运算中,要注意下面两个问题。•(1)运算符的优先级•C语言对每一种运算符都规定了优先级,混合运算中应按次序从高优先级的运算执行到低优先级的运算•(2)类型转换•自动类型转换•强制类型转换2.4.2赋值运算符和表达式•赋值运算符•(1)单纯赋值运算符“=”•(2)复合赋值运算符“+=”、“−=”、“*=”、“/=”•赋值表达式•用赋值运算符将一个变量和一个表达式连接起来,就成了赋值表达式。一般形式如下:•变量名赋值运算符表达式即:变量=表达式•特殊的赋值运算——自增、自减2.4.3逗号运算符和表达式•C语言中逗号“,”也是一种运算符,称为逗号运算符。其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式,其一般形式为:表达式1,表达式2•其求值过程是分别求两个表达式的值,并以表达式2的值作为整个逗号表达式的值。2.4.4位运算符和表达式•位运算符•位运算符是指进行二进制位的运算。C语言中提供的位运算包括与(&)、或(|)、异或(^)、取反(~)、移位(“”或“”)这些逻辑操作。•位表达式•将位运算符连接起来所构成的表达式称为位表达式。在位表达式中,依然要注意优先级的问题。在这些位运算符中,取反运算符(~)优先级最高,其次是移位运算符(和),再次是与(&)、或(|)和异或(^)。2.4.5关系运算符和表达式•关系运算符•比较两个值的运算符称为关系运算符,在C语言中有以下关系运算符:•(小于)、=(小于或等于)、(大于)、=(大于或等于)、==(等于)、!=(不等于)。•关系表达式•用关系表达式将两个式子(可以是各种类型的式子)连接起来的式子,称为关系表达式,关系表达式的一般形式为:表达式关系运算符表达式2.4.6逻辑运算符和表达式•逻辑运算符•C语言中提供了3种逻辑运算符:与运算符(&&)、或运算符(||)和非运算符(!),其中与运算符(&&)和或运算符(||)均为双目运算符,具有左结合性;非运算符(!)为单目运算符,具有右结合性。ab!a!ba&&ba||b真真假假真真真假假真假真假真真假假真假假真真假假2.4.6逻辑运算符和表达式•逻辑表达式•逻辑表达式的一般形式为:表达式逻辑运算符表达式•其中的表达式也可以是逻辑表达式,从而组成了嵌套的情形。•逻辑运算符和其他运算符优先级的关系如图!(非)算术运算符关系运算符&&和||赋值运算符(高)(低)移位操作符操作过程2.4.7sizeof操作符•sizeof是一个单目运算符,它的运算对象是变量或数据类型,其运算结果为一个整数。•若运算对象为变量,则所求的结果是这个变量占用的内存空间字节数,若运算对象是数据类型,则所求结果是这种数据类型的变量占用的内存空间字节数。2.4.8条件运算符•条件运算符(?)是C语言中惟一一个三目运算符,它可以提供如if-then-else语句的简易操作,其一般形式为:EXP1?EXE2:EXP3•这里EXP1、EXP2和EXP3都可以是表达式。表达式1条件表达式取表达式2的值条件表达式取表达式3的值2.4.9运算符优先级总结优先级运算符含义运算对象个数结合方向1()[]−.圆括号下标运算符指向结构体成员运算符结构体成员运算符自左向右2!~++−−−(类型)*&sizeof逻辑非运算按位取反运算自增运算符自减运算符负号运算符类型转换运算符指针运算符地址与运算符长度运算符1(单目)自右向左3*/%乘法运算符除法运算符求余运算符2(双目)自左向右4+−加法运算符减法运算符2(双目)自左向右2.4.9运算符优先级总结优先级运算符含义运算对象个数结合方向5左移运算符右移运算符2(双目)自左向右6==关系运算符2(双目)自左向右7==!=等于运算符不等于运算符2(双目)自左向右8&按位与运算符2(双目)自左向右9^按位异或运算符2(双目)自左向右10|按位或运算符2(双目)自左向右2.4.9运算符优先级总结优先级运算符含义运算对象个数结合方向11&&逻辑与运算符2(双目)自左向右12||逻辑或运算符2(双目)自左向右13?:条件运算符3(三目)自右向左14=+=−=*=/=%===&=^=|=赋值运算符2(双目)自右向左15,逗号运算符自左向右2.5程序结构和控制语句•2.5.1C语言程序结构•2.5.2C语言控制语句2.5.1C语言程序结构•从程序流程的角度来看,C语言中的语句可以分为3种基本结构:顺序结构、分支结构和循环结构。成立条件语句1语句2不成立语句2条件1成立语句1条件2成立语句3、4条件语句1语句2顺序结构成立条件语句1语句2不成立语句2条件1成立语句1条件2成立语句3、4条件分支结构真假语句1真假语句1当型循环直到型循环条件条件循环结构2.5.2C语言控制语句•C语言中的控制语句用于控制程序的流程,以实现程序的各种结构方式,包括:条件判断语句、循环语句和转向语句。•条件判断语句•if语句的形式•If语句的嵌套使用•Switch语句•循环语句•while和do-while语句•for循环语句•转向语句•转向语句包括break、continue和goto语句if语句的形式•if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的操作,if语句有3种形式:假真(a)成立条件语句1语句2不成立条件语句2(b)真真真条件1语句1假条件2假语句2条件3语句3语句4假(c)假真(a)成立条件语句1语句2不成立条件语句2(b)真真真条件1语句1假条件2假语句2条件3语句3语句4假(c)if语句的嵌套使用•在if语句中又包含一个或多个if语句称为if语句的嵌套,其形式一般如下:•if()•if()语句1•else语句2•else•if()语句3•else语句4嵌套嵌套switch语句•switch开关语句专门处理多路分支的情形,使程序变得简洁。•switch语句的一般格式为:•switch(表达式)•case常量表达式1:语句序列1;•case常量表达式2:语句序列2;•……•case常量表达式n:语句n;•default:语句n+1;•这里,switch后表达式中的结果必须是整型值或字符型值。这里的常量表达式是指在编译期间进行求值的表达式,它不能是任何变量。“case”表达式后的各语句序列允许有多条语句,不需要按复合语句处理。while和do-while语句•C语言中有两种循环结构:当型和直到型,其中while语句是当型循环结构,它的格式如下:•while(表达式)•{•循环体语句•}•在执行while循环语句时,先判断表达式的值,再执行循环体中的内容。•与此相对应的do-while是直到型循环结构,它的格式为:•do•{•循环体语句

1 / 78
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功