AVR单片机C语言编程课件

上传人:文**** 文档编号:240744355 上传时间:2024-05-04 格式:PPT 页数:100 大小:1.76MB
返回 下载 相关 举报
AVR单片机C语言编程课件_第1页
第1页 / 共100页
AVR单片机C语言编程课件_第2页
第2页 / 共100页
AVR单片机C语言编程课件_第3页
第3页 / 共100页
点击查看更多>>
资源描述
AVR单片机C语言编程v1C语言基础语言基础v2数据类型、运算符和表达式数据类型、运算符和表达式v3程序控制语句程序控制语句v4函数及其调用函数及其调用v5编译预处理编译预处理v6数组及指针数组及指针单片机单片机单片机单片机C C C C语言编程基础语言编程基础语言编程基础语言编程基础2024/5/42机电系统控制电路设计机电系统控制电路设计1C1C语言基础语言基础语言基础语言基础例子例子例子例子 1 1 2024/5/43机电系统控制电路设计机电系统控制电路设计例子例子例子例子 2 2 2 2 1C1C语言基础语言基础语言基础语言基础2024/5/44机电系统控制电路设计机电系统控制电路设计1C1C语言基础语言基础语言基础语言基础例子例子例子例子 3 3 3 3 2024/5/45机电系统控制电路设计机电系统控制电路设计1C1C语言基础语言基础语言基础语言基础/*给定半径,求圆的面积*/3.14159 /*编译预处理宏替换*/*编译预处理文件包含*/*编译预处理文件包含*/()/*主函数*/;/*定义变量r、s类型为单精度实型*/r=1.0;/*变量r赋初值*/*(r,2);/*计算圆面积s*/(半径 时,面积 n);/*输出结果*/例例4求圆面积程序求圆面积程序2024/5/46机电系统控制电路设计机电系统控制电路设计关于编译预处理(宏定义)关于编译预处理(宏定义)关于编译预处理(宏定义)关于编译预处理(宏定义)1C1C语言基础语言基础语言基础语言基础v 3.14159 不带参数 S()a*带参数 v 宏定义命令v 符号常量(宏名,最好用大写,以区别一般变量)v 3.14159 宏体(可以是一个表达式,如3+4)v作用:用简单符号代表宏体部份内容(编译时会先自动替换)v意义:直观/多次使用/便于修改v注意:可出现在程序的任一位置v (作用范围:由此行到程序末尾)v宏定义不是C语句,不必在行未加分号,否则会连分号一起置换。v 2024/5/47机电系统控制电路设计机电系统控制电路设计1C1C语言基础语言基础语言基础语言基础v v “头文件”(标准前导文件)vC语言是一种“装配式”语言,许多常规的工作如输入、输出、数学函数等,往往事先由人做成各种“程序模块”(库函数),存放在各种所谓“头文件”()中。使用时只需进行以下处理v “头文件名”或 v 在程序的执行部分调用该库函数:函数名(参数)v文件包含的作用,就是根据需要把相应的某个“头文件”的内容在编译时先整体嵌入所编的程序中。v用户也可以将自己设计的程序模块等做成“头文件”,供其他程序“包含”。关于编译预处理(文件包含)关于编译预处理(文件包含)关于编译预处理(文件包含)关于编译预处理(文件包含)2024/5/48机电系统控制电路设计机电系统控制电路设计1C1C语言基础语言基础语言基础语言基础标识符被 命令定义过 标识符程序段1程序段2关于编译预处理(条件编译)关于编译预处理(条件编译)关于编译预处理(条件编译)关于编译预处理(条件编译)标识符未被 命令定义过 标识符程序段1程序段2 表达式表达式真执行程序段1,假执行程序段2程序段1程序段22024/5/49机电系统控制电路设计机电系统控制电路设计1C1C语言基础语言基础语言基础语言基础 关于主函数 ()vC语言是一种函数式语言,它的一个函数实际上就是一个功能模块C程序的基本组成是函数。v一个C程序是由一个固定名称为的主函数和若干个其他函数(可没有)组成。v一个C程序必须有一个、也只能有一个主函数。v主函数在程序中的位置可以任意,但程序执行时总是从主函数开始,在主函数内结束。v主函数可以调用其他各种函数(包括用户自己编写的),但其他函数不能调用主函数。2024/5/410机电系统控制电路设计机电系统控制电路设计主函数的一般形式:主函数的一般形式:v()v 说明部分程序段(定义数据类型)v 执行部分程序段(给出操作指令)v 说明部分(简单程序可能没有此部分):;/*定义变量r、s类型为单精度实型*/;/*定义变量a、b类型为整型*/执行部份:输入、赋值、计算、控制、输出等:1.0;/*变量r赋初值*/*(r,2);/*计算圆面积s*/(半径 时,面积 n);/*输出结果*/1C1C语言基础语言基础语言基础语言基础2024/5/411机电系统控制电路设计机电系统控制电路设计其他函数其他函数v标准库函数只能调用。使用方法:v 先“包含”,即将该函数所在头文件包含在程序中。v 后调用。调用方式:函数名(参数)例:例:()()*(r,2);*(r,2);(“(“半径半径 时,面积时,面积n”);n”);说明:说明:()()求求 (中的标准数学函数)(中的标准数学函数)();();(中的标准输出函数中的标准输出函数)1C1C语言基础语言基础语言基础语言基础2024/5/412机电系统控制电路设计机电系统控制电路设计其他函数其他函数v自编(定义)函数:v 先定义(规定函数类型、函数名和函数功能)v 后调用(使用所定义的函数实现其功能)v 定义函数:v 函数类型 函数名(形式参数)v v (函数体)v v 调用函数:函数名(参数)求三个数的平均值求三个数的平均值求三个数的平均值求三个数的平均值(x,y,z)/*(x,y,z)/*定义函数定义函数定义函数定义函数()*/()*/;()/3;()/3;();();()/*()/*主函数主函数主函数主函数*/*/;3.5=4.6=7.9;3.5=4.6=7.9;();/*();/*调用自定义函数调用自定义函数调用自定义函数调用自定义函数()*/();()*/();1C1C语言基础语言基础语言基础语言基础2024/5/413机电系统控制电路设计机电系统控制电路设计关于语句:关于语句:数据类型定义语句数据类型定义语句v语句形式 v 变量类型关键字 变量名;v ;定义r、s为单精度实型变量 v ;定义r、s为整型变量v【注意】在C语言程序中,所有变量都要先定义后使用,否则就会出现编译错误提示,如:v :a v s 变量类型关键字 字符型(描述文字性的数据)数值型:整型(在机内是准确表示的)实型(在机内一般是近似表示的)(有效数字6位)(有效数字16位)变量名 C语言标识符(变量名、符号常量名、函数名等)命名:组成:字母、数字、下划线 开头:字母、下划线 长度:32字符【注意】大小写为不同字符(变量名一般小写,符号常量 名一般大写),还要注意不得与关键字同名。1C1C语言基础语言基础语言基础语言基础2024/5/414机电系统控制电路设计机电系统控制电路设计关于语句:关于语句:赋值语句赋值语句v作用:使变量获得具体的运算值。v语句形式v 变量名=表达式(常量、变量、函数、算式及其混合);v r=1.0;/*变量r赋初值*/v *(r,2);/*计算圆面积s*/v变量赋初值亦可在数据类型定义时进行:v r=1.0,s;v 把变量声明语句与赋值结合在一起的语句,术语上称为 “初始化语句”。1C1C语言基础语言基础语言基础语言基础2024/5/415机电系统控制电路设计机电系统控制电路设计关于语句:关于语句:输出语句输出语句v作用:将运算结果送到显示器屏幕显示出来v语句形式 v();v (半径 时,面积n);v (“!”);v【注意】C语言本身没有输入、输出语句,其功能要借用有关函数来实现。v 格式字符串v n 控制字符(转义字符)n表示回车换行 v 引号中的其他部分照原样输出1C1C语言基础语言基础语言基础语言基础2024/5/416机电系统控制电路设计机电系统控制电路设计关于格式字符串关于格式字符串v表示该处将用语句引号外对应表达式的值替换后输出v 例:若 r=13.14v (“半径 时,面积n”);v 输出结果:v 半径1 时,面积3.140000v常用格式字符串:v 字符型:单字符v 字符串v 数值型:整数(十进制)v 实数(小数形式,默认为6位小数)例一例一 x=5;x=5;f y=3;f y=3;(,);(,);输出结果:输出结果:53.000000 例二例二 x=5;x=5;f y=3;f y=3;(2*3,123);(2*3,123);输出结果:输出结果:79.0000001231C1C语言基础语言基础语言基础语言基础2024/5/417机电系统控制电路设计机电系统控制电路设计C C语言程序的基本结构语言程序的基本结构v 一个C程序是由一个固定名称为的主函数和若干个其他函数(可缺省)组成。v其基本结构一般形式如右图所示。编译预处理部分(可选)main()说明部分 /*变量定义等*/执行部分 /*输入/输出/计算*/其他函数(可选,位置任意)1C1C语言基础语言基础语言基础语言基础返回返回返回返回2024/5/418机电系统控制电路设计机电系统控制电路设计2 2数据类型、运算符和表达式数据类型、运算符和表达式数据类型、运算符和表达式数据类型、运算符和表达式2024/5/419机电系统控制电路设计机电系统控制电路设计2 2数据类型、运算符和表达式数据类型、运算符和表达式数据类型、运算符和表达式数据类型、运算符和表达式2024/5/420机电系统控制电路设计机电系统控制电路设计2 2数据类型、运算符和表达式数据类型、运算符和表达式数据类型、运算符和表达式数据类型、运算符和表达式 可知对不同数据类型占用的存储空间可知对不同数据类型占用的存储空间:=关系表达式:关系表达式:含有关系运算符的表达式含有关系运算符的表达式特别注意特别注意aXb之类算式的正确写法之类算式的正确写法:ax(错误写法:(错误写法:a5)(“m5”);(“”);(“”);运算结果:运算结果:65【例二】()5;(5)(“m5”);(“”);(“”);运算结果:运算结果:m5 2024/5/426机电系统控制电路设计机电系统控制电路设计2 2数据类型、运算符和表达式数据类型、运算符和表达式数据类型、运算符和表达式数据类型、运算符和表达式运算符运算符运算符运算符逻辑运算逻辑运算 (与运算符)(与运算符)运算符两边均为真时,结果为真运算符两边均为真时,结果为真 (或运算符)(或运算符)运算符两边均为假时,结果为假运算符两边均为假时,结果为假 !(非运算符)!(非运算符)将运算符右边真假倒置将运算符右边真假倒置 逻辑运算符的任一端如果为非逻辑运算符的任一端如果为非0数,则视为数,则视为“真真”,为,为0则视为假。则视为假。【例】【例】(“”,!3+5)结果为结果为5 (“”,!0+5)结果为结果为6注意:注意:!优先于关系运算符,与、同级。优先于关系运算符,与、同级。【例一】()1222;(b);(n);运行结果:2【例二】()1222;(a);(n);运行结果:3 原因:在和的左边如果能判断出结果,则右边不再作运算。结论:在逻辑表达式的求解中,并不是所有的逻辑运算符都会被执行。只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。2024/5/427机电系统控制电路设计机电系统控制电路设计2 2数据类型、运算符和表达式数据类型、运算符和表达式数据类型、运算符和表达式数据类型、运算符和表达式运算符运算符运算符运算符条件运算条件运算?:(三元运算符,即需连接三个运算量)(三元运算符,即需连接三个运算量)一般形式:一般形式:e123 e123 (e1e1为条件表达式,为条件表达式,e23e23为任意类型表达式)为任意类型表达式)功能:功能:如果如果e10e10(为真),运算结果为(为真),运算结果为e2e2的值。的值。如果如果e1=0e1=0(为假),则取(为假),则取e3e3的值。的值。【例】分别令30-5,求运行结果。();(“”);(“”);0?10)y=0(x=0)-1(x0)2024/5/428机电系统控制电路设计机电系统控制电路设计2 2数据类型、运算符和表达式数据类型、运算符和表达式数据类型、运算符和表达式数据类型、运算符和表达式运算符运算符运算符运算符位操作运算符位操作运算符&(&(与与)|)|(或)(或)(异或)(异或)(非)(非)(右移)(右移)2024/5/429机电系统控制电路设计机电系统控制电路设计2 2数据类型、运算符和表达式数据类型、运算符和表达式数据类型、运算符和表达式数据类型、运算符和表达式运算符的优先级运算符的优先级运算符的优先级运算符的优先级返回返回返回返回2024/5/430机电系统控制电路设计机电系统控制电路设计3 3 3 3 程序控制语句程序控制语句程序控制语句程序控制语句条件控制语句条件控制语句条件控制语句条件控制语句语句语句1、简单语句(表达式)程序段 下面程序的功能是:如果输入的数据大于等于60,则输出 !:(“”);(x=60)(“!n”);2024/5/431机电系统控制电路设计机电系统控制电路设计3 3 3 3 程序控制语句程序控制语句程序控制语句程序控制语句条件控制语句条件控制语句条件控制语句条件控制语句2、语句(表达式)程序段 程序段如果输入的数据大于等于60,则输出!否则输出!(“”);(x=60)(“!n”);(“!n”);语句语句2024/5/432机电系统控制电路设计机电系统控制电路设计3 3 3 3 程序控制语句程序控制语句程序控制语句程序控制语句条件控制语句条件控制语句条件控制语句条件控制语句()1000;180;(xy)交换x和y ;(n);()1000;180;(x010=20)(“10.20n);(n);语句语句2024/5/434机电系统控制电路设计机电系统控制电路设计3 3 3 3 程序控制语句程序控制语句程序控制语句程序控制语句条件控制语句条件控制语句条件控制语句条件控制语句语句语句(变量或表达式P)常量表达式C1:程序段S1;常量表达式C2:程序段S2;.常量表达式:程序段;:程序段1;2024/5/435机电系统控制电路设计机电系统控制电路设计();(F);();()A(100n);B(90n);C(80n);D(70n);E(60n);F(50n);(!n);3 3 3 3 程序控制语句程序控制语句程序控制语句程序控制语句条件控制语句条件控制语句条件控制语句条件控制语句语句语句运行结果:(F)D702024/5/436机电系统控制电路设计机电系统控制电路设计 子句可以省略,但是否省略子句,要根据算法的逻辑而定。因为没有了语句,语句会被执行到语句结束。3 3 3 3 程序控制语句程序控制语句程序控制语句程序控制语句条件控制语句条件控制语句条件控制语句条件控制语句语句语句 N;()Y(n);N(n);A(n);N;()Y(n);N(n);A(n);输出:输出:输出:输出:2024/5/437机电系统控制电路设计机电系统控制电路设计3 3 3 3 程序控制语句程序控制语句程序控制语句程序控制语句循环控制语句循环控制语句循环控制语句循环控制语句语句语句语句的形式:(表达式P)程序段S a;0;1;(a=100);(1+2n,100);语句的例子:计算语句的例子:计算1+2+3+1+2+3+100+100的值的值 通常情况下,程序中会利用一个变量来控制语句的表达式P的值,这个变量被称为循环控制变量。在执行语句之前,循环控制变量必须初始化,否则执行的结果将是不可预知的。上面的程序重新编写,其运行结果将是不可预知的,因为a未初始化:a;0;(a=100);(1+2n,100);2024/5/438机电系统控制电路设计机电系统控制电路设计3 3 3 3 程序控制语句程序控制语句程序控制语句程序控制语句循环控制语句循环控制语句循环控制语句循环控制语句语句语句有关语句的几点说明有关语句的几点说明 1、要在语句的某处(表达式P或循环体内)改变循环控制变量的值,否则极易构成死循环。下面的语句便是死循环:2;(x100);2024/5/440机电系统控制电路设计机电系统控制电路设计3 3 3 3 程序控制语句程序控制语句程序控制语句程序控制语句循环控制语句循环控制语句循环控制语句循环控制语句语句语句有关语句的几点说明有关语句的几点说明3、如果在执行循环体过程中,遇到了语句,则循环体中语句后面的其他语句将被跳过,而直接进入下一轮循环。1;(a=10)();(51);(*);运行结果:12*3*4*5*67*8*9*102024/5/441机电系统控制电路设计机电系统控制电路设计3 3 3 3 程序控制语句程序控制语句程序控制语句程序控制语句循环控制语句循环控制语句循环控制语句循环控制语句语句语句语句的形式:程序段S(表达式P);语句的例子:计算语句的例子:计算1+2+3+1+2+3+100+100的值的值a;0;1;(a=100);(1+2n,100);语句与语句大体相同,但要特别注意,()后面的分号不要漏掉。此外,语句的循环体可能永远不被执行,但语句的循环体至少被执行一次。2024/5/442机电系统控制电路设计机电系统控制电路设计3 3 3 3 程序控制语句程序控制语句程序控制语句程序控制语句循环控制语句循环控制语句循环控制语句循环控制语句语句语句语句的形式:必须是分号 必须是分号 (表达式1;表达式2 ;表达式3)程序段S 2024/5/443机电系统控制电路设计机电系统控制电路设计3 3 3 3 程序控制语句程序控制语句程序控制语句程序控制语句循环控制语句循环控制语句循环控制语句循环控制语句语句语句a;0;(1n2)1;2;(n3)3;(“n”,);输入三个整数,求三个整数中的最大值输入三个整数,求三个整数中的最大值不使用函数不使用函数(除外除外)();()n123;(“”123);(n123);(“n“);(z)m;(xy);(zm);m;输入三个整数,求三个整数中的最大值输入三个整数,求三个整数中的最大值使用函数使用函数子函数定义2024/5/450机电系统控制电路设计机电系统控制电路设计v形式参数与实际参数形式参数与实际参数v1、形式参数(形参):函数定义时设定的参数。、形式参数(形参):函数定义时设定的参数。v前例中,函数头前例中,函数头(z)中就是形参中就是形参v它们的类型都是整型。它们的类型都是整型。v2、实际参数(实参):调用函数时所使用的实际的参数。、实际参数(实参):调用函数时所使用的实际的参数。v前例中,主函数中调用函数的语句是:前例中,主函数中调用函数的语句是:(n123);其中其中n123就是实参,它们的类型都就是实参,它们的类型都是整型。是整型。v关于形参和实参的说明:关于形参和实参的说明:va、形参只有当调用时才临时分配存储单元。、形参只有当调用时才临时分配存储单元。vb、实参一定要有确定的值,可以是表达式。、实参一定要有确定的值,可以是表达式。vc、实参和形参的类型应相同或赋值相容。、实参和形参的类型应相同或赋值相容。4 4 4 4 函数及其调用函数及其调用函数及其调用函数及其调用2024/5/451机电系统控制电路设计机电系统控制电路设计4 4 4 4 函数及其调用函数及其调用函数及其调用函数及其调用形式参数与实际参数形式参数与实际参数 2024/5/452机电系统控制电路设计机电系统控制电路设计4 4 4 4 函数及其调用函数及其调用函数及其调用函数及其调用函数的返回值函数的返回值vC语言可以从函数(被调用函数)返回值给调用函数(这与数学函数相当类似)。在语言可以从函数(被调用函数)返回值给调用函数(这与数学函数相当类似)。在函数内是通过语句返回值的。函数可以使用一个或者多个语句返回值也可以不返回函数内是通过语句返回值的。函数可以使用一个或者多个语句返回值也可以不返回值(此时函数类型是)。值(此时函数类型是)。v语句的格式:语句的格式:v表达式表达式;或;或(表达式);(表达式);v说明:说明:v函数的类型就是返回值的类型,语句中表达式的类型应该与函数类型一致。函数的类型就是返回值的类型,语句中表达式的类型应该与函数类型一致。如果不一致,以函数类型为准(赋值转化)。如果不一致,以函数类型为准(赋值转化)。2024/5/453机电系统控制电路设计机电系统控制电路设计4 4 4 4 函数及其调用函数及其调用函数及其调用函数及其调用 局部变量局部变量 概念:是指在一定范围内有效的变量。概念:是指在一定范围内有效的变量。C语言中,在以下各位置定义的变量均属于语言中,在以下各位置定义的变量均属于局部变量。局部变量。在函数体内定义的变量:在本函数范围内有效,作用域局限于函数体内。在函数体内定义的变量:在本函数范围内有效,作用域局限于函数体内。在复合语句内定义的变量:在本复合语句范围内有效,作用域局限于复合语句内。在复合语句内定义的变量:在本复合语句范围内有效,作用域局限于复合语句内。有参函数的形式参数也是局部变量:只在其所在的函数范围内有效。有参函数的形式参数也是局部变量:只在其所在的函数范围内有效。2024/5/454机电系统控制电路设计机电系统控制电路设计4 4 4 4 函数及其调用函数及其调用函数及其调用函数及其调用 全局变量全局变量 全局变量:在函数之外定义的变量。(所有函数前,各个函数之间,所有函数后)全局变量:在函数之外定义的变量。(所有函数前,各个函数之间,所有函数后)全局变量作用域:从定义全局变量的位置起到本源程序结束为止。全局变量作用域:从定义全局变量的位置起到本源程序结束为止。在引用全局变量时如果使用在引用全局变量时如果使用“”声明全局变量,可以扩大全局变量的作用域。例声明全局变量,可以扩大全局变量的作用域。例如,扩大到整个源文件(模块),对于多源文件(模块)可以扩大到其它源文件如,扩大到整个源文件(模块),对于多源文件(模块)可以扩大到其它源文件(模块)。(模块)。全局变量和局部变量同名的全局变量和局部变量同名的“屏蔽屏蔽”。2024/5/455机电系统控制电路设计机电系统控制电路设计4 4 4 4 函数及其调用函数及其调用函数及其调用函数及其调用全局变量和局部变量的应用全局变量和局部变量的应用局部变量局部变量输出结果输出结果。1002024/5/456机电系统控制电路设计机电系统控制电路设计4 4 4 4 函数及其调用函数及其调用函数及其调用函数及其调用v变量(局部/全局)两大属性:数据类型 存储类别1、数据类型(复习)通过变量说明(定义)来规定其数据类型:格式 数据类型关键字 变量名 如 a;为什么使用变量前要先对其数据类型进行“说明”好比看电影前先买票订座 预留存储空间(如型为1个字节型为2个字节)确定存储方式(如型存放值型存放补码值)2024/5/457机电系统控制电路设计机电系统控制电路设计v变量(局部/全局)两大属性:数据类型 存储类别4 4 4 4 函数及其调用函数及其调用函数及其调用函数及其调用2、存储类别 规定了变量在计算机内部的存放位置决定变量的“寿命”(何时“生”,何时“灭”)一个完整的变量说明格式如下:存储类别 数据类型 变量名 如 x,y;C程序的存储类别有:型(寄存器型)型(自动变量型)型(静态变量型)型(外部变量型)2024/5/458机电系统控制电路设计机电系统控制电路设计C C程序的变量存储位置程序的变量存储位置4 4 4 4 函数及其调用函数及其调用函数及其调用函数及其调用变量的生存期 静态存储区中的变量:与程序“共存亡”动态存储区中的变量:与函数“共存亡”寄存器中的变量:同静态存储区2024/5/459机电系统控制电路设计机电系统控制电路设计4 4 4 4 函数及其调用函数及其调用函数及其调用函数及其调用C C程序的变量存储类别程序的变量存储类别 型(寄存器型)型(寄存器型)变量值存放在运算器的寄存器中变量值存放在运算器的寄存器中存取速度快,一般只允许存存取速度快,一般只允许存23个变量,且限于型和个变量,且限于型和型,通常用于循环变量。型,通常用于循环变量。型(自动变量型)型(自动变量型)变量值存放在主存储器的动态存储区(堆栈方式);变量值存放在主存储器的动态存储区(堆栈方式);优点优点同一内存区可被不同变量反复使用。同一内存区可被不同变量反复使用。以上两种变量均属于以上两种变量均属于“动态存储型动态存储型”,即调用函数时才为这些变量分配单元,函数调用结,即调用函数时才为这些变量分配单元,函数调用结束其值自动消失。束其值自动消失。2024/5/460机电系统控制电路设计机电系统控制电路设计4 4 4 4 函数及其调用函数及其调用函数及其调用函数及其调用C C程序的变量存储类别程序的变量存储类别 型(静态变量型)型(静态变量型)变量值存放在主存储器的静态存储区变量值存放在主存储器的静态存储区程序执行开始至结束,始终占用该存储空间程序执行开始至结束,始终占用该存储空间 型(外部变量型)型(外部变量型)同上,其值可供其他源文件使用同上,其值可供其他源文件使用以上两种均属于以上两种均属于“静态存储静态存储”性质,即从变量定义处开始,在整个程序执行期间其值性质,即从变量定义处开始,在整个程序执行期间其值都存在(都存在(都可用都可用!)2024/5/461机电系统控制电路设计机电系统控制电路设计4 4 4 4 函数及其调用函数及其调用函数及其调用函数及其调用 (默认)所在函数调用结束时,其值自动消失局部变量 如不赋初值,取不确定值为初值 所有函数调用结束,其值仍保留 如不赋初值,取初值为0(数值型)或空字符0(字符型)(默认)允许本源文件中其他函数及其他全局变量 源文件使用 只限本源文件中使用 2024/5/462机电系统控制电路设计机电系统控制电路设计4 4 4 4 函数及其调用函数及其调用函数及其调用函数及其调用求程序运行结果求程序运行结果()2;()清楚屏幕,内部函数 (03)(%4d(a);f(a)0;3;变量跟踪变量跟踪 ()f函数函数 a i b c f(a)2 0 01 4 7 1 01 5 8 2 01 6 9 【结果】【结果】7 8 9 如果去掉呢?如果去掉呢?【结果】【结果】7 7 72024/5/463机电系统控制电路设计机电系统控制电路设计4 4 4 4 函数及其调用函数及其调用函数及其调用函数及其调用求程序运行结果求程序运行结果()41;();();(,);();();(b)02;1;m;变量跟踪变量跟踪()函数函数kmabmi414108234141817312【结果】【结果】8,17如果去掉呢?如果去掉呢?【结果】8,82024/5/464机电系统控制电路设计机电系统控制电路设计4 4 4 4 函数及其调用函数及其调用函数及其调用函数及其调用求程序运行结果求程序运行结果()3,2,1;注意应用范围 5,12注意应用范围 *2;(n,a,b,c);(n,a,b,c);【结果】352 521 2024/5/465机电系统控制电路设计机电系统控制电路设计4 4 4 4 函数及其调用函数及其调用函数及其调用函数及其调用 35;(b)c;c;()8;(n();求程序运行结果求程序运行结果【结果】8如果主函数中没有 8,结果?【结果】5如果让主函数中 4或1,结果?【结果】均为 52024/5/466机电系统控制电路设计机电系统控制电路设计4 4 4 4 函数及其调用函数及其调用函数及其调用函数及其调用求程序运行结果求程序运行结果();1510;()75;();(n);【结果】5,25如果第二行不加上呢?如果第二行不加上呢?【结果】12,2 2024/5/467机电系统控制电路设计机电系统控制电路设计4 4 4 4 函数及其调用函数及其调用函数及其调用函数及其调用求程序运行结果求程序运行结果 0;(i)2*i;a;()10;();(n(a);【结果】20,10 返回返回返回返回2024/5/468机电系统控制电路设计机电系统控制电路设计5 5 5 5 编译预处理编译预处理编译预处理编译预处理v预处理v在编译之前对源程序进行“预处理”v预处理命令不是C语句,末尾没有分号v预处理命令不在可执行文件中执行v预处理命令都以#开始v包括宏定义、文件包含、条件编译等v举例v 1000v 2024/5/469机电系统控制电路设计机电系统控制电路设计宏宏()()定义定义5 5 5 5 编译预处理编译预处理编译预处理编译预处理v无参数的宏定义v带参数的宏定义2024/5/470机电系统控制电路设计机电系统控制电路设计5 5 5 5 编译预处理编译预处理编译预处理编译预处理无参数的宏定义无参数的宏定义v一般形式v 标识符 字符串v说明v把源程序中相应标识符予以替换v仅是简单的字符串替换,没有任何语法正确性检查v有效范围从定义处开始,到文件结束,或者由命令终止作用域v行末没有分号,如有分号将会被一起替换 R 3.0 3.1415926 L 2*R (;)()/*/(,L);/*取消对的宏定义取消对的宏定义*/;/*(;);无限循环无限循环*/*/2024/5/471机电系统控制电路设计机电系统控制电路设计5 5 5 5 编译预处理编译预处理编译预处理编译预处理带参数的宏定义带参数的宏定义v一般形式v 宏名(参数表)字符串v说明v宏定义仅是把参数作为字符串做简单替换,而不做任何运算求值和语法检查v宏名与参数表的括号之间不应有空格v应注意参数替换后可能出现的语法错误和意料之外的运算v应在宏定义内容及其中参数两边加上括号 S1()a*b S2()(a)*(b)()(a)(b)?(a):(b)()3,4,5,6,s,z;1(,);/*;11*/2(,);/*()*();7*/(,);/*()()?():();*/*7,6,8*/2024/5/472机电系统控制电路设计机电系统控制电路设计5 5 5 5 编译预处理编译预处理编译预处理编译预处理文件包含文件包含v一般形式v v v说明v把另一个源文件的全部内容包含进来v预编译后,它们已成为一个文件v头文件的扩展名一般用,但并非规定v调用库函数一般使用,也可以使用v调用用户编写的头文件应使用2024/5/473机电系统控制电路设计机电系统控制电路设计条件编译条件编译5 5 5 5 编译预处理编译预处理编译预处理编译预处理v条件编译v对某些部分的源程序指定编译的条件v可以减少被编译的语句,减少目标程序的长度,减少运行时间v有利于移植程序,增加程序的灵活性v命令形式2024/5/474机电系统控制电路设计机电系统控制电路设计 如果标识符被定义过*如果标识符未被定义过 标识符 标识符 程序段1 程序段1 /*编译此程序段*/*部分可省略*/程序段2 程序段2 /*反之,编译此程序段*/*此处指标识符用等命令定义过。条件编译条件编译5 5 5 5 编译预处理编译预处理编译预处理编译预处理 表达式 /*如果表达式为真*/程序段1 /*编译程序段1*/程序段2 /否则*编译程序段2*/2024/5/475机电系统控制电路设计机电系统控制电路设计5 5 5 5 编译预处理编译预处理编译预处理编译预处理 0()1020;();(n);(n);条件编译条件编译结果:10200如果没有行呢?只输出0 返回返回返回返回2024/5/476机电系统控制电路设计机电系统控制电路设计6 6数组及指针数组及指针数组及指针数组及指针 C 语言可以根据用户需要,用基本数据类型定义特殊性质的数据类型,称为构造语言可以根据用户需要,用基本数据类型定义特殊性质的数据类型,称为构造类型。构造类型有:数组、结构体、共同体。类型。构造类型有:数组、结构体、共同体。数组:相同数据类型变量的有序集合。有序表现在数组元数在内存中连续存放。数组:相同数据类型变量的有序集合。有序表现在数组元数在内存中连续存放。数组用一个名字作为标识。为区分各元素,每个元素有一个用整型表示的序号,数组用一个名字作为标识。为区分各元素,每个元素有一个用整型表示的序号,称之为下标。下标可以有多个,下标的个数称为数组的维数。称之为下标。下标可以有多个,下标的个数称为数组的维数。2024/5/477机电系统控制电路设计6 6数组及指针数组及指针数组及指针数组及指针1.1.一维数组的定义一维数组的定义 1常量表达式常量表达式,常量表达式常量表达式;类型说明符,说明数组的类型。类型说明符,说明数组的类型。数组名,用标识符命名。数组名,用标识符命名。数组的元素的个数,数组的下标从数组的元素的个数,数组的下标从0变化到常量达式变化到常量达式的值减一。的值减一。例:a5;b2015;a0a1a2a3a4分配内存分配内存2024/5/478机电系统控制电路设计6 6数组及指针数组及指针数组及指针数组及指针一维数组定义的几点说明:一维数组定义的几点说明:数组名命名规则和变量名相同,遵循标识符定名规则。数组名命名规则和变量名相同,遵循标识符定名规则。数组名后是用方括弧括起来的常量表达式,不能用圆括数组名后是用方括弧括起来的常量表达式,不能用圆括 弧弧.如:如:a (10);!a (10);!常量表达式表示元素的个数,即数组长度。常量表达式表示元素的个数,即数组长度。如如:a10:a10有有1010个元素分别为:个元素分别为:a0123456789;a0123456789;注意不能使用数组元素注意不能使用数组元素a10a10。常量表达式中可以包括常量和符号常量,不能包含变量。也就是说,常量表达式中可以包括常量和符号常量,不能包含变量。也就是说,C C语言不允许对数组的大小语言不允许对数组的大小作动态定义。例如,下面这样定义数组是不行的:作动态定义。例如,下面这样定义数组是不行的:n n;(,);an;!an;!2024/5/479机电系统控制电路设计6 6数组及指针数组及指针数组及指针数组及指针一维数组一维数组一维数组一维数组2.2.一维数组的引用一维数组的引用原原则:只能引用数组元素,而不能引用整个数组。则:只能引用数组元素,而不能引用整个数组。引用方式:数组名引用方式:数组名下标下标下标可以是整型常量或整型表达式。下标可以是整型常量或整型表达式。每个数组元素,可以出现在简单变量能够出现的任何地方。每个数组元素,可以出现在简单变量能够出现的任何地方。例:例:()()10;10;(i (i0 0;ii9 9;)ai aii;i;(i (i9 9;i i0 0;)(i);i);2024/5/480机电系统控制电路设计6 6数组及指针数组及指针数组及指针数组及指针一维数组一维数组一维数组一维数组3.3.一维数组的初始化一维数组的初始化对数组元素的初始化可以用以下方法实现:对数组元素的初始化可以用以下方法实现:在定义数组时对数组元素赋以初值。例如在定义数组时对数组元素赋以初值。例如 a10=0 a10=0,1 1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,99;只给一部分元素赋值。例如只给一部分元素赋值。例如 a10 a1000,1 1,2 2,3 3,44;这表示只给前面这表示只给前面5 5个元素赋初值个元素赋初值,后后5 5个元素值为个元素值为0 0。使一个数组中全部元素值为使一个数组中全部元素值为0 0 a10=0,0,0,0,0,0,0,0,0,0 a10=0,0,0,0,0,0,0,0,0,0;或或 a10=0;a10=0;不能写成不能写成 a10=0*10 a10=0*10;2024/5/481机电系统控制电路设计6 6数组及指针数组及指针数组及指针数组及指针一维数组一维数组一维数组一维数组3.3.一维数组的初始化一维数组的初始化v在对全部数组元素赋初值时,可以不指定数组长度。在对全部数组元素赋初值时,可以不指定数组长度。v 例如:例如:v a5=1,2 a5=1,2,3 3,4 4,55;v 可以写成可以写成:v a a1,21,2,3 3,4 4,5;5;v 如想定义数组长度为如想定义数组长度为1010,就不能省略数组长度的定义,而必须写成,就不能省略数组长度的定义,而必须写成:v a10 a1011,2 2,3 3,4,5;4,5;v 只初始化前只初始化前5 5个元素,后个元素,后5 5个元素为个元素为0 0。2024/5/482机电系统控制电路设计例:输入例:输入1010个整数,分别按顺序和逆序输出。个整数,分别按顺序和逆序输出。()i;a10;(10:n);(0;i10;)(,i);(n);(0;i=0;)(,ai);程序的运行情况:10:1 2 3 4 5 6 7 8 9 101 2 3 4 5 6 7 8 9 1010 9 8 7 6 5 4 3 2 1 2024/5/483机电系统控制电路设计6 6数组及指针数组及指针数组及指针数组及指针二维数组二维数组二维数组二维数组1.1.二维数组的定义二维数组的定义n定义方式:n 类型 数组名表达式1表达式2;行数列数例:a34510;不能写成 a3,45,10;2024/5/484机电系统控制电路设计说明:说明:二维数组可看作特殊的一维数组;二维数组可看作特殊的一维数组;元素在内存排列顺序为按行存放;元素在内存排列顺序为按行存放;多维数组定义亦类似于二维数组多维数组定义亦类似于二维数组 如:如:234;234;1.1.二维数组的定义二维数组的定义6 6数组及指针数组及指针数组及指针数组及指针二维数组二维数组二维数组二维数组a00 a01 a02a10a11a12例:a23;它的存储情况:按行存放2024/5/485机电系统控制电路设计注意理解二维数组:注意理解二维数组:注意理解二维数组:注意理解二维数组:把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。例如,可以把把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。例如,可以把把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。例如,可以把把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。例如,可以把a34a34a34a34看看看看作是一个一维数组,它有作是一个一维数组,它有作是一个一维数组,它有作是一个一维数组,它有3 3 3 3个元素,每个元素又是一个包含个元素,每个元素又是一个包含个元素,每个元素又是一个包含个元素,每个元素又是一个包含4 4 4 4个元素的一维数组:个元素的一维数组:个元素的一维数组:个元素的一维数组:a0 a00 a01 a02 a03 a0 a00 a01 a02 a03 a0 a00 a01 a02 a03 a0 a00 a01 a02 a03 a1 a10 a11 a12 a13 a1 a10 a11 a12 a13 a1 a10 a11 a12 a13 a1 a10 a11 a12 a13 a2 a20 a21 a22 a23 a2 a20 a21 a22 a23 a2 a20 a21 a22 a23 a2 a20 a21 a22 a23 上面定义的二维数组可以理解为定义了三个一维数组,即相当于上面定义的二维数组可以理解为定义了三个一维数组,即相当于上面定义的二维数组可以理解为定义了三个一维数组,即相当于上面定义的二维数组可以理解为定义了三个一维数组,即相当于 f1 a041424 f1 a041424 f1 a041424 f1 a041424此处把此处把此处把此处把a012a012a012a012看作一维数组名。看作一维数组名。看作一维数组名。看作一维数组名。c c c c语言的这种处理方法在数组初始化和用指针表示时显得很语言的这种处理方法在数组初始化和用指针表示时显得很语言的这种处理方法在数组初始化和用指针表示时显得很语言的这种处理方法在数组初始化和用指针表示时显得很方便,这在以后会介绍。方便,这在以后会介绍。方便,这在以后会介绍。方便,这在以后会介绍。2024/5/486机电系统控制电路设计2.2.二维数组的引用二维数组的引用6 6数组及指针数组及指针数组及指针数组及指针二维数组二维数组二维数组二维数组数组名数组名行下标行下标 列下标列下标;如:如:a23,数组元素可出现在表达式中,也可被赋值如:,数组元素可出现在表达式中,也可被赋值如:a12=a02/2。注意:下标值应在已定义的数组大小的范围内。注意:下标值应在已定义的数组大小的范围内。如:如:a23错了,其最大下标为错了,其最大下标为1和和2。2024/5/487机电系统控制电路设计3.3.二维数组的初始化二维数组的初始化6 6数组及指针数组及指针数组及指针数组及指针二维数组二维数组二维数组二维数组1 1)分行初始化。如:)分行初始化。如:a34=1,2,3,4,5,6,7,8,9,10,11,12;a34=1,2,3,4,5,6,7,8,9,10,11,12;2 2)按数组排列的顺序将所有数据写在一个花括号内。如:)按数组排列的顺序将所有数据写在一个花括号内。如:34=1,2,3,4,5,6,7,8,9,10,11,12;34=1,2,3,4,5,6,7,8,9,10,11,12;3 3)部分元素初始化。如:)部分元素初始化。如:a34=1,0,6,0,0,11;a34=1,0,6,0,0,11;4 4)如果对全部元素都赋初值,则定义数组时可以不指定)如果对全部元素都赋初值,则定义数组时可以不指定 第一维的长度。如:第一维的长度。如:a4=1,2,3,4,5,6,7,8,9,10,11,12;a4=1,2,3,4,5,6,7,8,9,10,11,12;2024/5/488机电系统控制电路设计6 6数组及指针数组及指针数组及指针数组及指针字符数组字符数组字符数组字符数组 C语言没有字符串变量,可以定义字符数组,每个元素存放一个字符,从而达到存放字符串的目语言没有字符串变量,可以定义字符数组,每个元素存放一个字符,从而达到存放字符串的目的。的。字符数组的定义字符数组的定义 数组名数组名下标下标;a10212;字符数组的初始化字符数组的初始化一维数组赋初值一维数组赋初值:用单个字符对每一个元数赋值。用单个字符对每一个元数赋值。15=h,e,l,l,o;把把5个字符分别赋给个字符分别赋给104这这5个元素个元素2024/5/489机电系统控制电路设计注意:注意:如果花括弧中提供的初值个数(即字符个数)大于数组长度,则作语法错误处理。如:如果花括弧中提供的初值个数(即字符个数)大于数组长度,则作语法错误处理。如:14=14=h h,e e,l l,l l,o o;!;!如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动为空字如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动为空字符符(即即00)。110=110=h h,e e,l l,l l,o o;如果初值个数与预定的数组长度相同,在定义时可以省略数组的长度,系统会自动根据初值个数如果初值个数与预定的数组长度相同,在定义时可以省略数组的长度,系统会自动根据初值个数确定数组长度。确定数组长度。1=1=h h,e e,l l,l l,o o;等价于:等价于:15=15=h h,e e,l l,l l,o o;hello1 1在内存中的存放形式:在内存中的存放形式:注:一般情况下,说明数组时,长度指定应至少比实际长度大注:一般情况下,说明数组时,长度指定应至少比实际长度大1 1,保证赋初值正确。,保证赋初值正确。2024/5/490机电系统控制电路设计6 6数组及指针数组及指针数组及指针数组及指针字符数组字符数组字符数组字符数组二维数组赋初值二维数组赋初值二维数组的每一行可以存放一个字符串。二维数组的每一行可以存放一个字符串。36=w,a,n,g,z,h,a,n,g,l,i,u;wang00zhang0liu000数组在内存中存储形式数组在内存中存储形式2024/5/491机电系统控制电路设计6 6数组及指针数组及指针数组及指针数组及指针字符数组字符数组字符数组字符数组3.字符数组的引用字符数组的引用可以引用字符数组中的一个元素,得到一个字符。可以引用字符数组中的一个元素,得到一个字符。例:输出一个钻石图形。例:输出一个钻石图形。()()5=,*,*,*,5=,*,*,*,*,*,*,*,*;*,*,*,*,*;(0 (0;i5i5;)(j (j0 0;j5j5;)(ij);(ij);(n);(n);*00*000*0*0*000*0*0*000*002024/5/492机电系统控制电路设计4.字符串和字符串结束标志字符串和字符串结束标志在在C C语言中,将字符串作为字符数组来处理。语言中,将字符串作为字符数组来处理。有效字符串的长度:为测定字符串的实际长度,有效字符串的长度:为测定字符串的实际长度,C C语言有一个语言有一个“字符串结束标志字符串结束标志”(00)。例:。例:有一个字符串,其第有一个字符串,其第1010个字符为个字符为00,则此字符串的有效字符为,则此字符串的有效字符为9 9个。系统对字符串常量也自动加个。系统对字符串常量也自动加一个一个00作为结束符。作为结束符。在定义字符数组时应估计实际字符串长度,使数组长度始终保证大于字符串实际长度。在定义字符数组时应估计实际字符串长度,使数组长度始终保证大于字符串实际长度。16=16=h h,e e,l l,l l,o o;系统对字符串常量也自动加一个系统对字符串常量也自动加一个00来作为结束符来作为结束符 例例:“”共有共有7 7个字符,但内存中占个字符,但内存中占8 8个字节,最后一个字节个字节,最后一个字节00是由系统自动完成的是由系统自动完成的6 6数组及指针数组及指针数组及指针数组及指针字符数组字符数组字符数组字符数组2024/5/493机电系统控制电路设计6 6数组及指针数组及指针数组及指针数组及指针字符数组字符数组字符数组字符数组可以用字符串常量来使字符数组初始化。例如可以用字符串常量来使字符数组初始化。例如:c=I ;c=I ;也可以省略花括号,直接写成:也可以省略花括号,直接写成:c=I ;c=I ;此时数组此时数组c c的长度为多少?的长度为多少?注:数组的长度为注:数组的长度为1111,而不是,而不是1010,这是因为字符串常量,这是因为字符串常量 的最后由系统加上一个的最后由系统加上一个00上面的初始化与下面的初始化等价:上面的初始化与下面的初始化等价:c=c=I I,a a,m m,h h,a a,p p,p p,y y,00;4.字符串和字符串结束标志字符串和字符串结束标志2024/5/494机电系统控制电路设计6 6数组及指针数组及指针数组及指针数组及指针字符数组字符数组字符数组字符数组4.字符串和字符串结束标志字符串和字符串结束标志需要说明的是需要说明的是:1 1)字符数组并不要求它的最后一个字符为)字符数组并不要求它的最后一个字符为0 0,甚至可以不包含,甚至可以不包含0 0。象以下这样写。象以下这样写完全是合法的:完全是合法的:5=C,h,i,n,a;5=C,h,i,n,a;是否需要加入是否需要加入00,完全根据需要决定。但是只要用字符串常量就会自动加一个,完全根据需要决定。但是只要用字符串常量就会自动加一个0 0。2 2)人们为了使处理方法一致,便于测定字符串的实际长度以及在程序中作相应的处理,在字)人们为了使处理方法一致,便于测定字符串的实际长度以及在程序中作相应的处理,在字符数组中也常常人为地加上一个符数组中也常常人为地加上一个0 0。如:。如:c6=C,h,i,n,a,0;c6=C,h,i,n,a,0;2024/5/495机电系统控制电路设计5.字符数组与字符串的输入输出字符数组与字符串的输入输出6 6数组及指针数组及指针数组及指针数组及指针字符数组字符数组字符数组字符数组n假设有定义 a10;1 1)用格式符)用格式符”逐个字符输入输出逐个字符输入输出:(”0);0);(”,a0);/*,a0);/*每次输入输出一个字符每次输入输出一个字符*/*/2 2)用格式符)用格式符“”整个字符串输入输出整个字符串输入输出:c10 c10;(,c)c);/*/*注意此处用数组名注意此处用数组名c*/c*/(,c)c);/*/*注意此处用数组名注意此处用数组名c*/c*/2024/5/496机电系统控制电路设计5.字符数组与和字符串的出入输出字符数组与和字符串的出入输出6 6数组及指针数组及指针数组
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!