《AVR单片机C语言编程》由会员分享,可在线阅读,更多相关《AVR单片机C语言编程(99页珍藏版)》请在金锄头文库上搜索。
1、机电系统控制电路设计机电系统控制电路设计张志安张志安机电系统控制电路设计机电系统控制电路设计22024/8/23v1C语言基础语言基础v2数据类型、运算符和表达式数据类型、运算符和表达式v3程序控制语句程序控制语句v4函数及其调用函数及其调用v5编译预处理编译预处理v6数组及指针数组及指针AVRAVRAVRAVR单片机单片机单片机单片机C C C C语言编程基础语言编程基础语言编程基础语言编程基础机电系统控制电路设计机电系统控制电路设计32024/8/231C语言基础语言基础例子例子例子例子 1 1 机电系统控制电路设计机电系统控制电路设计42024/8/23例子例子例子例子 2 2 2 2
2、1C语言基础语言基础机电系统控制电路设计机电系统控制电路设计52024/8/231C语言基础语言基础例子例子例子例子 3 3 3 3 机电系统控制电路设计机电系统控制电路设计62024/8/231C语言基础语言基础/*给定半径,求圆的面积*/#define PI 3.14159 /*编译预处理宏替换*/#include /*编译预处理文件包含*/#include /*编译预处理文件包含*/main( ) /*主函数*/ float r,s; /*定义变量r、s类型为单精度实型*/ r =1.0; /*变量r赋初值*/ s=PI * pow(r,2); /*计算圆面积s*/ printf (半径
3、R=%f 时,面积S=%f n,r,s); /*输出结果*/例例4求圆面积程序求圆面积程序 area.carea.c机电系统控制电路设计机电系统控制电路设计72024/8/23关于编译预处理(宏定义)关于编译预处理(宏定义)关于编译预处理(宏定义)关于编译预处理(宏定义)1C语言基础语言基础v#define PI 3.14159 -不带参数 #define S(a,b) a*b-带参数 v #define 宏定义命令v PI 符号常量(宏名,最好用大写,以区别一般变量)v 3.14159 宏体(可以是一个表达式,如3+4)v作用:用简单符号代表宏体部份内容(编译时会先自动替换)v意义:直观/多
4、次使用/便于修改v注意: #define 可出现在程序的任一位置 (作用范围:由此行到程序末尾)v宏定义不是C语句,不必在行未加分号,否则会连分号一起置换。 机电系统控制电路设计机电系统控制电路设计82024/8/231C语言基础语言基础v#include stdio.h“头文件”(标准前导文件)vC语言是一种“装配式”语言,许多常规的工作如输入、输出、数学函数等,往往事先由人做成各种“程序模块”(库函数),存放在各种所谓“头文件”(.h)中。使用时只需进行以下处理 #include “头文件名” 或 #include 在程序的执行部分调用该库函数:函数名(参数)v文件包含的作用,就是根据需要
5、把相应的某个“头文件”的内容在编译时先整体嵌入所编的程序中。v用户也可以将自己设计的程序模块等做成“头文件”,供其他程序“包含”。关于编译预处理(文件包含)关于编译预处理(文件包含)关于编译预处理(文件包含)关于编译预处理(文件包含)机电系统控制电路设计机电系统控制电路设计92024/8/231C语言基础语言基础标识符被#define 命令定义过#ifdef 标识符程序段1#else程序段2#endif关于编译预处理(条件编译)关于编译预处理(条件编译)关于编译预处理(条件编译)关于编译预处理(条件编译)标识符未被#define 命令定义过#ifndef 标识符程序段1#else程序段2#en
6、dif#if 表达式-表达式真执行程序段1,假执行程序段2程序段1#else程序段2#endif机电系统控制电路设计机电系统控制电路设计102024/8/231C语言基础语言基础 关于主函数关于主函数关于主函数关于主函数 main( ) main( ) vC语言是一种函数式语言,它的一个函数实际上就是一个功能模块C程序的基本组成是函数。v一个C程序是由一个固定名称为main的主函数和若干个其他函数(可没有)组成。v一个C程序必须有一个、也只能有一个主函数。v主函数在程序中的位置可以任意,但程序执行时总是从主函数开始,在主函数内结束。v主函数可以调用其他各种函数(包括用户自己编写的),但其他函数
7、不能调用主函数。机电系统控制电路设计机电系统控制电路设计112024/8/23主函数的一般形式:主函数的一般形式:vmain( ) 说明部分程序段(定义数据类型) 执行部分程序段(给出操作指令) 说明部分(简单程序可能没有此部分): floatr,s;/*定义变量r、s类型为单精度实型*/inta,b;/*定义变量a、b类型为整型*/执行部份:输入、赋值、计算、控制、输出等:r=1.0;/*变量r赋初值*/s=PI*pow(r,2);/*计算圆面积s*/printf(半径半径R=%f时,面积时,面积S=%fn,r,s);/*输出结果*/1C语言基础语言基础机电系统控制电路设计机电系统控制电路设
8、计122024/8/23其他函数其他函数v标准库函数只能调用 。使用方法: 先“包含”,即将该函数所在头文件包含在程序中。 后调用。调用方式:函数名(参数)例:例: #include #include main( ) s=PI*pow(r,2); printf(“半径R=%f 时,面积S=%fn”,r,s); 说明:pow(x,y) 求xy (math.h中的标准数学函数) printf(); (stdio.h中的标准输出函数) 1C语言基础语言基础机电系统控制电路设计机电系统控制电路设计132024/8/23其他函数其他函数v自编(定义)函数: 先定义(规定函数类型、函数名和函数功能) 后调
9、用(使用所定义的函数实现其功能) 定义函数: 函数类型 函数名(形式参数) (函数体) 调用函数:函数名(参数)求三个数的平均值求三个数的平均值求三个数的平均值求三个数的平均值floataverage(floatx,floaty,floatz)/*floataverage(floatx,floaty,floatz)/*定义函数定义函数定义函数定义函数average()*/average()*/ floataver;floataver;aver=(x+y+z)/3;aver=(x+y+z)/3;return(aver);return(aver); main()/*main()/*主函数主函数主函
10、数主函数* */ /floata,b,c,ave;floata,b,c,ave;a=3.5;b=4.6;c=7.9;a=3.5;b=4.6;c=7.9;ave=average(a,b,c);/*ave=average(a,b,c);/*调用自定义函数调用自定义函数调用自定义函数调用自定义函数average()*/average()*/printf(printf( average=%faverage=%f ,ave);,ave); 1C语言基础语言基础机电系统控制电路设计机电系统控制电路设计142024/8/23关于语句:关于语句:数据类型定义语句数据类型定义语句v语句形式 变量类型关键字变量类
11、型关键字 变量名; floatr,s;定义r、s为单精度实型变量intr,s;定义r、s为整型变量【注意】在C语言程序中,所有变量都要先定义后使用,否则就会出现编译错误提示,如: Error: Undefined symbol a in function main Lets try变量类型关键字 字符型(描述文字性的数据) char 数值型: 整型(在机内是准确表示的整型(在机内是准确表示的) int 实型(在机内一般是近似表示的实型(在机内一般是近似表示的) float (有效数字6位) double(有效数字16位)变量名 C语言标识符标识符标识符标识符(变量名、符号常量名、函数名等)命名
12、: 组成:字母、数字、下划线 开头:字母、下划线 长度:32字符【注意】大小写为不同字符(变量名一般小写,符号常量 名一般大写),还要注意不得与关键字同名。1C语言基础语言基础机电系统控制电路设计机电系统控制电路设计152024/8/23关于语句:关于语句: 赋值语句赋值语句v作用:使变量获得具体的运算值。v语句形式 变量名=表达式(常量、变量、函数、算式及其混合);r =1.0;/*变量r赋初值*/s=PI*pow(r,2);/*计算圆面积s*/v变量赋初值亦可在数据类型定义时进行: float r =1.0, s; 把变量声明语句与赋值结合在一起的语句,术语上称为 “初始化语句”。1C语言
13、基础语言基础机电系统控制电路设计机电系统控制电路设计162024/8/23关于语句:关于语句: 输出语句输出语句v作用:将运算结果送到显示器屏幕显示出来v语句形式 printf ( ) ; printf (半径半径R=%f 时,面积时,面积S=%fn,r,s); printf (“Hello,everyone!”);v【注意】C语言本身没有输入、输出语句,其功能要借用有关函数来实现。 %f 格式字符串 n 控制字符(转义字符) n表示回车换行 引号中的其他部分照原样输出1C语言基础语言基础机电系统控制电路设计机电系统控制电路设计172024/8/23关于格式字符串关于格式字符串v表示该处将用p
14、rintf语句引号外对应表达式的值替换后输出 例:若 r =1,s=3.14 printf(“半径半径R=%f时,面积时,面积S=%fn”,r,s); 输出结果: 半径R=1 时,面积S=3.140000常用格式字符串: 字符型:%c 单字符 %s 字符串 数值型:%d 整数(十进制) %f 实数(小数形式,默认为6位小数) 例一例一 int x = 5; f loat y =3; printf (a=%d,b=%f,c=%s,x,y, abcdefg);输出结果:输出结果: a=5,b=3.000000,c=abcdefg 例二例二 int x = 5; f loat y =3; print
15、f (a=%d,b=%f,c=%s,x+2,y*3, 123defg);输出结果:输出结果: a=7,b=9.000000,c=123defg1C语言基础语言基础机电系统控制电路设计机电系统控制电路设计182024/8/23C C语言程序的基本结构语言程序的基本结构v 一个C程序是由一个固定名称为main的主函数和若干个其他函数(可缺省)组成。v其基本结构一般形式如右图所示。编译预处理部分(可选)main( ) 说明部分 /*变量定义等*/执行部分 /*输入/输出/计算*/ 其他函数(可选,位置任意)1C语言基础语言基础返回返回返回返回机电系统控制电路设计机电系统控制电路设计192024/8/
16、232数据类型、运算符和表达式数据类型、运算符和表达式机电系统控制电路设计机电系统控制电路设计202024/8/232数据类型、运算符和表达式数据类型、运算符和表达式机电系统控制电路设计机电系统控制电路设计212024/8/232数据类型、运算符和表达式数据类型、运算符和表达式 可知对不同数据类型占用的存储空间可知对不同数据类型占用的存储空间: : charshort=intlong=float=!= 关系表达式: 含有关系运算符的表达式 特别注意 aXb 之类算式的正确写法 : a=x & x=b(错误写法:a=X5) printf(“m5”); else printf(“m=%d”,m-)
17、; printf(“m=%d”,m-); 运算结果运算结果: m=6,m=5 【例二】main( ) int m=5; if (+m5) printf(“m5”); else printf(“m=%d”,m-); printf(“m=%d”,m-); 运算结果运算结果: m5 机电系统控制电路设计机电系统控制电路设计272024/8/232数据类型、运算符和表达式数据类型、运算符和表达式运算符运算符运算符运算符逻辑运算逻辑运算 &(与运算符) 运算符两边均为真时,结果为真 | (或运算符) 运算符两边均为假时,结果为假 !(非运算符) 将运算符右边真假倒置 逻辑运算符的任一端如果为非0数,则视
18、为“真”,为0则视为假。 【例】 printf(“%d”, !3+5) 结果为5 printf(“%d”, !0+5) 结果为6注意:! 优先于关系运算符,与+、-同级。【例一】 main( ) int a=1,b=2,m=2,n=2; (m=ab)&+n; printf(%dn,n); 运行结果:n=2 【例二】 main( ) int a=1,b=2,m=2,n=2; (m=ba)&+n; printf(%dn,n); 运行结果:n=3 原因:在&和|的左边如果能判断出结果,则右边不再作运算。 结论:在逻辑表达式的求解中,并不是所有的逻辑运算符都会被执行。只是在必须执行下一个逻辑运算符才能
19、求出表达式的解时,才执行该运算符。机电系统控制电路设计机电系统控制电路设计282024/8/232数据类型、运算符和表达式数据类型、运算符和表达式运算符运算符运算符运算符条件运算条件运算 ? : (三元运算符,即需连接三个运算量)一般形式: e1?e2:e3 (e1为条件表达式,e2,e3为任意类型表达式)功能: 如果e10(为真),运算结果为e2的值。 如果e1=0(为假),则取e3的值。【例】分别令x=3,x=0,x= -5,求运行结果。main( ) int x,y; printf(“Input x=”); scanf(“%d”,&x); y=x0?1:x0)y= 0 (x=0) -1
20、(x0)机电系统控制电路设计机电系统控制电路设计292024/8/232数据类型、运算符和表达式数据类型、运算符和表达式运算符运算符运算符运算符位操作运算符位操作运算符 &(与AND) |(或OR) (异或XOR) (非NOT) (右移) 机电系统控制电路设计机电系统控制电路设计302024/8/232数据类型、运算符和表达式数据类型、运算符和表达式运算符的优先级运算符的优先级运算符的优先级运算符的优先级返回返回返回返回机电系统控制电路设计机电系统控制电路设计312024/8/233 3 程序控制语句程序控制语句条件控制语句条件控制语句条件控制语句条件控制语句ifif语句语句1、简单if语句i
21、f(表达式表达式)程序段程序段 下面程序的功能是:如果输入的数据大于等于60,则输出You are passed!:scanf(“%d”,&x);if(x=60) printf(“You are passed!n”); 机电系统控制电路设计机电系统控制电路设计322024/8/233 3 程序控制语句程序控制语句条件控制语句条件控制语句条件控制语句条件控制语句2、if-else语句if(表达式) 程序段 else 程序段如果输入的数据大于等于60,则输出 You are passed!否则输出You failed!scanf(“%d”,&x);if(x=60) printf(“You are
22、passed!n”); else printf(“You failed!n”); ifif语句语句机电系统控制电路设计机电系统控制电路设计332024/8/233 3 程序控制语句程序控制语句条件控制语句条件控制语句条件控制语句条件控制语句#include main() int x,y=100,z=0; x=180; if(xy) /交换x和y z=x; x=y; y=z; rintf(x=%d,y=%dn,x,y);#include main() int x,y=100,z=0; x=180; if(x0&x10&x=20)printf(“ 10.20n);elseprintf(errorn
23、);ifif语句语句机电系统控制电路设计机电系统控制电路设计352024/8/233 3 程序控制语句程序控制语句条件控制语句条件控制语句条件控制语句条件控制语句switchswitch语句语句switch(变量或表达式P) case 常量表达式C1:程序段S1 break; case 常量表达式C2:程序段S2 break; . case 常量表达式Cn:程序段Sn break; default:程序段Sn+1 break; 机电系统控制电路设计机电系统控制电路设计362024/8/23#include main() char ch; printf(input the mark(A,B,C,
24、D,E or F); scanf(%c,&ch); switch(ch) case A:printf(100n); break; case B:printf(90n); break; case C:printf(80n); break; case D:printf(70n); break; case E:printf(60n); break; case F:printf(50n); break; default:printf(input error!n); 3 3 程序控制语句程序控制语句条件控制语句条件控制语句条件控制语句条件控制语句switchswitch语句语句运行结果:input th
25、e mark(A,B,C,D,E or F) D 70机电系统控制电路设计机电系统控制电路设计372024/8/23 break子句可以省略,但是否省略break子句,要根据算法的逻辑而定。因为没有了break语句,switch语句会被执行到语句结束。3 3 程序控制语句程序控制语句条件控制语句条件控制语句条件控制语句条件控制语句switchswitch语句语句char ch=N;switch(ch) case Y:printf(Yesn); break; case N:printf(Non); break; case A:printf(Alln); break;char ch=N;switc
26、h(ch) case Y:printf(Yesn); break; case N:printf(Non); case A:printf(Alln); break;输出:输出:NoNo输出:输出:NoNo All All机电系统控制电路设计机电系统控制电路设计382024/8/233 3 程序控制语句程序控制语句循环控制语句循环控制语句循环控制语句循环控制语句whilewhile语句语句while语句的形式: while(表达式P)程序段S int a; long sum;/sum should be long type sum=0; a=1; while(a=100) sum+=a; a+;
27、printf(1+2+.+%d=%ldn,100,sum);whilewhile语句的例子:计算语句的例子:计算1+2+3+1+2+3+100+100的值的值 通常情况下,程序中会利用通常情况下,程序中会利用一个一个变量变量来来控制控制whilewhile语句的表语句的表达式达式P P的值,这个变量被称为的值,这个变量被称为循循环控制变量环控制变量。在执行。在执行whilewhile语句语句之前,循环控制变量之前,循环控制变量必须初始化必须初始化,否则执行的结果将是不可预知的。,否则执行的结果将是不可预知的。上面的程序重新编写,其运行结果将是不可预知的,因为上面的程序重新编写,其运行结果将是不
28、可预知的,因为a a未初始化:未初始化:int a; long sum;/sum should be long type sum=0; /a should be initialized here while(a=100) sum+=a; a+; printf(1+2+.+%d=%ldn,100,sum);机电系统控制电路设计机电系统控制电路设计392024/8/233 3 程序控制语句程序控制语句循环控制语句循环控制语句循环控制语句循环控制语句whilewhile语句语句有关有关whilewhile语句的几点说明语句的几点说明 1、要在while语句的某处(表达式P或循环体内)改变循环控制变量
29、的值,否则极易构成死循环。下面的while语句便是死循环:x=2;while(x100)break; sum+=a; a+; 机电系统控制电路设计机电系统控制电路设计412024/8/233 3 程序控制语句程序控制语句循环控制语句循环控制语句循环控制语句循环控制语句whilewhile语句语句有关有关whilewhile语句的几点说明语句的几点说明3、如果在执行循环体过程中,遇到了continue语句,则循环体中continue语句后面的其他语句将被跳过,而直接进入下一轮循环。a=1;while(a=10) printf(%d,a); a+; if(a%5=1) continue; prin
30、tf(*); 运行结果:12*3*4*5*67*8*9*10机电系统控制电路设计机电系统控制电路设计422024/8/233 3 程序控制语句程序控制语句循环控制语句循环控制语句循环控制语句循环控制语句do-whiledo-while语句语句do-while语句的形式:do 程序段Swhile(while(表达式表达式P);P);do-whiledo-while语句的例子:计算语句的例子:计算1+2+3+1+2+3+100+100的值的值inta;longsum;sum=0;a=1;dosum+=a;a+;while(a=100);printf(1+2+.+%d=%ldn,100,sum);
31、do-while语句与while语句大体相同,但要特别注意,while( )后面的分号不要漏掉。此外,while语句的循环体可能永远不被执行,但do-while语句的循环体至少被执行一次。机电系统控制电路设计机电系统控制电路设计432024/8/233 3 程序控制语句程序控制语句循环控制语句循环控制语句循环控制语句循环控制语句forfor语句语句for语句的形式: 必须是分号 必须是分号 for(表达式1 ; ; 表达式2 ; ; 表达式3) 程序段S 机电系统控制电路设计机电系统控制电路设计442024/8/233 3 程序控制语句程序控制语句循环控制语句循环控制语句循环控制语句循环控制语
32、句forfor语句语句inta;longsum;sum=0;for(a=1;an2)nmax=n1;elsenmax=n2;if(n3nmax)nmax=n3;printf(“max=%dn”,nmax); 输入三个整数,求三个整数中的最大值输入三个整数,求三个整数中的最大值不使用函数不使用函数(除除main外外)intmax(int,int,int);main()intn1,n2,n3,nmax;scanf(“%d%d%d”,&n1,&n2,&n3);nmax=max(n1,n2,n3);printf(“max=%dn“,nmax);intmax(intx,inty,intz)intm;if
33、(xy)m=x;elsem=y;if(zm)m=z;returnm;输入三个整数,求三个整数中的最大值输入三个整数,求三个整数中的最大值使用函数使用函数子函数定义机电系统控制电路设计机电系统控制电路设计512024/8/23v形式参数与实际参数形式参数与实际参数1、形式参数形式参数(形参):函数定义时设定的参数。(形参):函数定义时设定的参数。前例中,函数头前例中,函数头intmax(intx,inty,intz)中中x,y,z就是形参就是形参它们的类型都是整型。它们的类型都是整型。2、实际参数实际参数(实参):调用函数时所使用的实际的参数。(实参):调用函数时所使用的实际的参数。前例中,主函
34、数中调用前例中,主函数中调用max函数的语句是:函数的语句是:nmax=max(n1,n2,n3);其中其中n1,n2,n3就是实参,它们的类型都是就是实参,它们的类型都是整型。整型。关于形参和实参的说明:关于形参和实参的说明:va、形参只有当调用时才临时分配存储单元。、形参只有当调用时才临时分配存储单元。vb、实参一定要有确定的值,可以是表达式。、实参一定要有确定的值,可以是表达式。vc、实参和形参的类型应相同或赋值相容。、实参和形参的类型应相同或赋值相容。4 4 函数及其调用函数及其调用机电系统控制电路设计机电系统控制电路设计522024/8/234 4 函数及其调用函数及其调用形式参数与
35、实际参数形式参数与实际参数 机电系统控制电路设计机电系统控制电路设计532024/8/234 4 函数及其调用函数及其调用函数的返回值函数的返回值vC语言可以从函数(被调用函数)返回值给调用函数(这与数学语言可以从函数(被调用函数)返回值给调用函数(这与数学函数相当类似)。在函数内是通过函数相当类似)。在函数内是通过return语句返回值的。函数语句返回值的。函数可以使用一个或者多个可以使用一个或者多个return语句返回值也可以不返回值(此语句返回值也可以不返回值(此时函数类型是时函数类型是void)。)。vreturn语句的格式:语句的格式:return表达式表达式;或;或return(表
36、达式)(表达式);v说明:说明:函数的类型就是返回值的类型,函数的类型就是返回值的类型,return语句中表达式的类语句中表达式的类型应该与函数类型一致。如果不一致,以型应该与函数类型一致。如果不一致,以函数类型函数类型为准(赋值为准(赋值转化)。转化)。机电系统控制电路设计机电系统控制电路设计542024/8/234 4 函数及其调用函数及其调用 局部变量局部变量概念:概念:是指在一定范围内有效的变量。是指在一定范围内有效的变量。C语言中,语言中,在以下各位置定义的变量均属于局部变量。在以下各位置定义的变量均属于局部变量。在函数体内定义的变量:在函数体内定义的变量:在本函数范围内有效,作在本
37、函数范围内有效,作用域局限于函数体内。用域局限于函数体内。在复合语句内定义的变量:在复合语句内定义的变量:在本复合语句范围内有在本复合语句范围内有效,作用域局限于复合语句内。效,作用域局限于复合语句内。有参函数的形式参数也是局部变量:有参函数的形式参数也是局部变量:只在其所在的只在其所在的函数范围内有效。函数范围内有效。 机电系统控制电路设计机电系统控制电路设计552024/8/234 4 函数及其调用函数及其调用 全局变量全局变量 全局变量:全局变量:在函数之外定义的变量。(所有函数前,在函数之外定义的变量。(所有函数前,各个函数之间,所有函数后)各个函数之间,所有函数后) 全局变量作用域:
38、全局变量作用域:从定义全局变量的位置起到本源从定义全局变量的位置起到本源程序结束为止。程序结束为止。 在引用全局变量时如果使用在引用全局变量时如果使用“externextern”声明全局变声明全局变量,可以扩大全局变量的作用域。例如,扩大到量,可以扩大全局变量的作用域。例如,扩大到整个源文件(模块),对于多源文件(模块)可整个源文件(模块),对于多源文件(模块)可以扩大到其它源文件(模块)。以扩大到其它源文件(模块)。 全局变量和局部变量同名的全局变量和局部变量同名的“屏蔽屏蔽”。机电系统控制电路设计机电系统控制电路设计562024/8/234 4 函数及其调用函数及其调用全局变量和局部变量的
39、应用全局变量和局部变量的应用局部变量局部变量输出结果输出结果。count is 100机电系统控制电路设计机电系统控制电路设计572024/8/234 4 函数及其调用函数及其调用v变量(局部/全局)两大属性: 数据类型 存储类别1、数据类型(复习) 通过变量说明(定义)来规定其数据类型: 格式 数据类型关键字 变量名 如 char a; int b,c ; float x,y; 为什么使用变量前要先对其数据类型进行“说明”好比看电影前先买票订座 预留存储空间(如char型为1个字节,int型为2个字节) 确定存储方式(如char型存放ASCII值,int型存放补码值)机电系统控制电路设计机电
40、系统控制电路设计582024/8/23v变量(局部/全局)两大属性: 数据类型 存储类别4 4 函数及其调用函数及其调用2、存储类别 规定了变量在计算机内部的存放位置决定变量的“寿命”(何时“生”,何时“灭”) 一个完整的变量说明格式如下: 存储类别 数据类型 变量名 如 static int x , y ;C程序的存储类别有: register型(寄存器型) auto型(自动变量型) static型(静态变量型) extern型(外部变量型)机电系统控制电路设计机电系统控制电路设计592024/8/23C C程序的变量存储位置程序的变量存储位置4 4 函数及其调用函数及其调用变量的生存期 静
41、态存储区中的变量:与程序“共存亡” 动态存储区中的变量:与函数“共存亡” 寄存器中的变量:同静态存储区机电系统控制电路设计机电系统控制电路设计602024/8/234 4 函数及其调用函数及其调用C C程序的变量存储类别程序的变量存储类别 register型(寄存器型)型(寄存器型) 变量值存放在运算器的寄存器中存取速度快,一般只允许存23个变量,且限于char型和int型,通常用于循环变量。 auto型(自动变量型)型(自动变量型) 变量值存放在主存储器的动态存储区(堆栈方式);优点同一内存区可被不同变量反复使用。 以上两种变量均属于“动态存储型”,即调用函数时才为这些变量分配单元,函数调用
42、结束其值自动消失。机电系统控制电路设计机电系统控制电路设计612024/8/234 4 函数及其调用函数及其调用C C程序的变量存储类别程序的变量存储类别 static型(静态变量型)型(静态变量型)变量值存放在主存储器的静态存储区程序执行开始至结束,始终占用该存储空间 extern型(外部变量型)型(外部变量型)同上,其值可供其他源文件使用以上两种均属于“静态存储”性质,即从变量定义处开始,在整个程序执行期间其值都存在(都可用!)机电系统控制电路设计机电系统控制电路设计622024/8/234 4 函数及其调用函数及其调用 auto(默认) 所在函数调用结束时,其值自动消失局部变量 regi
43、ster 如不赋初值,取不确定值为初值 static 所有函数调用结束,其值仍保留 如不赋初值,取初值为0(数值型)或空字符0(字符型) extern(默认)允许本源文件中其他函数及其他全局变量 源文件使用 static 只限本源文件中使用 机电系统控制电路设计机电系统控制电路设计632024/8/234 4 函数及其调用函数及其调用求程序运行结果求程序运行结果main() int a=2,i; clrscr( );/清楚屏幕,内部函数 for (i=0;i3;i+) printf(%4d,f(a);f(int a) int b=0; static int c=3; b+;c+; return
44、 a+b+c; 变量跟踪变量跟踪 mainmain( )( ) f f函数函数 a i a i b b c c c c f(a) f(a) 2 0 01 4 7 2 0 01 4 7 1 01 5 8 1 01 5 8 2 01 6 9 2 01 6 9 【结果结果】 7 8 9 7 8 9 如果去掉如果去掉staticstatic呢?呢?【结果结果】 7 7 7机电系统控制电路设计机电系统控制电路设计642024/8/234 4 函数及其调用函数及其调用求程序运行结果求程序运行结果main() int k=4,m=1,p; clrscr(); p=func(k,m); printf(%d,p
45、); p=func(k,m); printf(%d,p);func(int a,int b) static int m=0,i=2; i+=m+1; m=i+a+b; return m; 变量跟踪变量跟踪main( ) func函数 k m a b m i 4 1 4 1 08 23 4 1 4 1 817 312 【结果】 8, 17 如果去掉如果去掉staticstatic呢?呢?【结果】 8, 8机电系统控制电路设计机电系统控制电路设计652024/8/234 4 函数及其调用函数及其调用求程序运行结果求程序运行结果#include main() int a=3, b=2, c=1; /
46、注意应用范围 int b=5, c=12;/注意应用范围 c-=b*2; printf(a=%d,b=%d,c=%dn, a, b, c); a+=c; printf(a=%d,b=%d,c=%dn, a, b, c);【结果】 a=3,b=5,c=2 a=5,b=2,c=1 机电系统控制电路设计机电系统控制电路设计662024/8/234 4 函数及其调用函数及其调用int a=3,b=5;max(int a,int b) int c; c=ab?a:b; return c; main() int a=8; printf(%dn,max(a,b); 求程序运行结果求程序运行结果【结果】 8如
47、果主函数中没有int a=8,结果? 【结果】 5如果让主函数中int a=4或a=-1,结果? 【结果】 均为 5机电系统控制电路设计机电系统控制电路设计672024/8/234 4 函数及其调用函数及其调用求程序运行结果求程序运行结果void num() extern int x,y; int a=15,b=10; x=a-b; y=a+b;int x,y;main() int a=7,b=5; x=a+b; y=a-b; num(); printf(%d,%dn,x,y);【结果】 5,25如果第二行不加上如果第二行不加上externextern呢?呢? 【结果】 12,2 机电系统控制
48、电路设计机电系统控制电路设计682024/8/234 4 函数及其调用函数及其调用求程序运行结果求程序运行结果int a=0;fun(int i) a+=2*i; return a; main() int a=10; clrscr( ); printf(%d,%dn,fun(a),a); 【结果】 20,10 返回返回返回返回机电系统控制电路设计机电系统控制电路设计692024/8/235 5 编译预处理编译预处理v预处理在编译之前对源程序进行“预处理”预处理命令不是C语句,末尾没有分号预处理命令不在可执行文件中执行预处理命令都以#开始包括宏定义、文件包含、条件编译等v举例#define MA
49、X 1000#include 机电系统控制电路设计机电系统控制电路设计702024/8/23宏宏(Macro)(Macro)定义定义5 5 编译预处理编译预处理v无参数的宏定义v带参数的宏定义机电系统控制电路设计机电系统控制电路设计712024/8/235 5 编译预处理编译预处理无参数的宏定义无参数的宏定义v一般形式#define 标识符 字符串v说明把源程序中相应标识符予以替换仅是简单的字符串替换,没有任何语法正确性检查有效范围从定义处开始,到文件结束,或者由#undef命令终止作用域行末没有分号,如有分号将会被一起替换#define R 3.0#define PI 3.1415926#d
50、efine L 2*PI*R#define begin #define end #define forever for(;)int main()begin /* */ printf(L=%f, L);#undef PI /* 取消对PI的宏定义 */ forever; /* for(;); 无限循环 */end /* */机电系统控制电路设计机电系统控制电路设计722024/8/235 5 编译预处理编译预处理带参数的宏定义带参数的宏定义v一般形式#define 宏名(参数表) 字符串v说明宏定义仅是把参数作为字符串做简单替换,而不做任何运算求值和语法检查宏名与参数表的括号之间不应有空格应注意
51、参数替换后可能出现的语法错误和意料之外的运算应在宏定义内容及其中参数两边加上括号#define S1(a,b) a*b#define S2(a,b) (a)*(b)#define max(a,b) (a)(b)?(a):(b)int main() int x=3, y=4, i=5, j=6, s, z; s=S1(x+y, x-y); /* s=x+y*x-y; s=11 */ s=S2(x+y, x-y); /* s=(x+y)*(x-y); s=-7 */ z=max(i+, j+); /* z=(i+)(j+)?(i+):(j+); */ /* z=7, i=6, j=8 */机电系统
52、控制电路设计机电系统控制电路设计732024/8/235 5 编译预处理编译预处理文件包含文件包含v一般形式#include filename#include v说明把另一个源文件的全部内容包含进来预编译后,它们已成为一个文件头文件的扩展名一般用.h,但并非规定调用库函数一般使用,也可以使用调用用户编写的头文件应使用机电系统控制电路设计机电系统控制电路设计742024/8/23条件编译条件编译5 5 编译预处理编译预处理v条件编译对某些部分的源程序指定编译的条件可以减少被编译的语句,减少目标程序的长度,减少运行时间有利于移植程序,增加程序的灵活性v命令形式#ifdef.#else.#endif
53、#ifndef.#else.#endif#if.#else.#endif机电系统控制电路设计机电系统控制电路设计752024/8/23 如果标识符被定义过* 如果标识符未被定义过 #ifdef 标识符 #ifndef 标识符 程序段1 程序段1 /*编译此程序段*/ #else #else/*#else部分可省略*/ 程序段2 程序段2 /*反之,编译此程序段*/ #endif #endif *此处指标识符用#define等命令定义过。条件编译条件编译5 5 编译预处理编译预处理 #if 表达式 /*如果表达式为真*/ 程序段1 /*编译程序段1*/ #else 程序段2 /否则*编译程序段2
54、*/ #endif机电系统控制电路设计机电系统控制电路设计762024/8/235 5 编译预处理编译预处理#define DEBUG 0main() int a=10,b=20,c; clrscr(); c=a/b; #ifdef DEBUG printf(a=%d,b=%dn,a,b); #endif printf(c=%dn,c);条件编译条件编译结果:a=10,b=20c=0如果没有#define行呢? 只输出c=0 返回返回返回返回2024/8/23776数组及指针数组及指针 C 语言可以根据用户需要,用基本数据类型定义语言可以根据用户需要,用基本数据类型定义特殊性质的数据类型,称为
55、特殊性质的数据类型,称为构造类型构造类型构造类型构造类型。构造类型有:。构造类型有:数组、结构体、共同体。数组、结构体、共同体。数组数组:相同数据类型变量的有序集合。有序表现:相同数据类型变量的有序集合。有序表现在数组元数在内存中连续存放。在数组元数在内存中连续存放。数组用一个名字作为标识。为区分各元素,每个数组用一个名字作为标识。为区分各元素,每个元素有一个用整型表示的序号,称之为下标。下标可元素有一个用整型表示的序号,称之为下标。下标可以有多个,下标的个数称为数组的维数。以有多个,下标的个数称为数组的维数。机电系统控制电路设计2024/8/23786数组及指针数组及指针1.1.一维数组的定
56、义一维数组的定义type array1常量表达式常量表达式, , arrayn常量表达式常量表达式;类型说明符,说明数组的类型。类型说明符,说明数组的类型。数组名,用标识符命名。数组名,用标识符命名。数组的元素的个数,数组的下标数组的元素的个数,数组的下标从从0变化到常量达式的值减一。变化到常量达式的值减一。 例:例:int a5;int a5; float b20,c15; float b20,c15;a0a1a2a3a4分配内存分配内存机电系统控制电路设计2024/8/23796数组及指针数组及指针一维数组定义的几点说明:一维数组定义的几点说明:v数组名命名规则和变量名相同,遵循标识符定名
57、规则。数组名命名规则和变量名相同,遵循标识符定名规则。v数组名后是用数组名后是用方括弧方括弧括起来的常量表达式,不能用圆括括起来的常量表达式,不能用圆括 弧弧. . 如:如: int a (10); ERROR!int a (10); ERROR!v常量表达式表示元素的个数,即数组长度。常量表达式表示元素的个数,即数组长度。 如如: : a10a10有有1010个元素分别为:个元素分别为: a0,a1,a2,a3,a4,a5,a6,a7,a8,a9a0,a1,a2,a3,a4,a5,a6,a7,a8,a9; ;注意不能使用数组元素注意不能使用数组元素a10a10。v常量表达式中可以包括常量和符
58、号常量,常量表达式中可以包括常量和符号常量,不能包含变量不能包含变量。也就是说,也就是说,C C语言不允许对数组的大小作动态定义。例如,语言不允许对数组的大小作动态定义。例如,下面这样定义数组是不行的:下面这样定义数组是不行的: int nint n; scanf(%d scanf(%d,&n)&n); int an; int an; ERROR!ERROR!机电系统控制电路设计2024/8/23806数组及指针数组及指针一维数组一维数组一维数组一维数组2.2.一维数组的引用一维数组的引用原原则:则:只能引用数组元素,而不能引用整个数组只能引用数组元素,而不能引用整个数组。引用方式:引用方式:
59、数组名数组名 下标下标 下标可以是整型常量或整型表达式。下标可以是整型常量或整型表达式。每个数组元素,可以出现在简单变量能够出现的任何地方。每个数组元素,可以出现在简单变量能够出现的任何地方。例:例: main () main () int i,a10; int i,a10; for (i for (i0 0;ii9 9;i+)i+) ai aii;i; for(i for(i9 9;i i0 0;i-)i-) printf printf(%d,ai);%d,ai); 机电系统控制电路设计2024/8/23816数组及指针数组及指针一维数组一维数组一维数组一维数组3.3.一维数组的初始化一维数
60、组的初始化对数组元素的初始化可以用以下方法实现:对数组元素的初始化可以用以下方法实现:v在定义数组时对数组元素赋以初值。例如在定义数组时对数组元素赋以初值。例如 int a10=0 int a10=0,1 1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,99;v只给一部分元素赋值。例如只给一部分元素赋值。例如 int a10 int a1000,1 1,2 2,3 3,44; 这表示这表示只给前面只给前面5 5个元素赋初值个元素赋初值, ,后后5 5个元素值为个元素值为0 0。v使一个数组中全部元素值为使一个数组中全部元素值为0 0 int a10=0,0,0,0,0,0,0,0,
61、0,0 int a10=0,0,0,0,0,0,0,0,0,0; 或或 int a10=0;int a10=0; 不能写成不能写成: :int a10=0*10int a10=0*10; 机电系统控制电路设计2024/8/23826数组及指针数组及指针一维数组一维数组一维数组一维数组3.3.一维数组的初始化一维数组的初始化v在对全部数组元素赋初值时,可以不指定数组长度。在对全部数组元素赋初值时,可以不指定数组长度。 例如:例如: int int a5=a5=1, 21, 2,3 3,4 4,55; 可以写成可以写成: : int int aa1, 21, 2,3 3,4 4,5;5; 如如想想
62、定定义义数数组组长长度度为为1010,就就不不能能省省略略数数组组长长度度的的定定义义,而必须写成而必须写成: : int a10 int a1011,2 2,3 3,4 , 5;4 , 5; 只初始化前只初始化前5 5个元素,后个元素,后5 5个元素为个元素为0 0。 机电系统控制电路设计2024/8/2383例:输入例:输入1010个整数,分别按个整数,分别按顺序顺序和和逆序逆序输出。输出。#include main()int i;static int a10; printf(input 10 numbers:n); for(i=0;i10;i+) scanf(%d,&ai); print
63、f(n);for(i=0;i=0;i-) printf(%d,ai);程序的运行情况:input 10 numbers: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/8/23846数组及指针数组及指针二维数组二维数组二维数组二维数组1.1.二维数组的定义二维数组的定义n定义方式:n 类型 数组名表达式1表达式2;行数列数例:float a34,b510;不能写成float a3,4,b5,10;机电系统控制电路设计2024/8/2385说明:说明:v二维数组可看作特殊的一维数组;二维数组可看
64、作特殊的一维数组;v元素在内存排列顺序为按行存放;元素在内存排列顺序为按行存放;v多维数组定义亦类似于二维数组多维数组定义亦类似于二维数组 如:如:floata234;floata234;1.1.二维数组的定义二维数组的定义6数组及指针数组及指针二维数组二维数组二维数组二维数组a00 a01 a02a10a11a12例: int a23; 它的存储情况:按行存放机电系统控制电路设计2024/8/2386注意理解二维数组:注意理解二维数组:注意理解二维数组:注意理解二维数组: 把二维数组看作是把二维数组看作是一种特殊的一维数组一种特殊的一维数组:它的元素又是一个它的元素又是一个一维数组一维数组。
65、例如,可以把。例如,可以把a34a34看作是一个一维数组,它看作是一个一维数组,它有有3 3个个元素,元素,每个元素又是一个包含每个元素又是一个包含4 4个元素的一维数组个元素的一维数组: a0a0 a00 a01 a02 a03a00 a01 a02 a03 a1a1 a10 a11 a12 a13a10 a11 a12 a13 a2a2 a20 a21 a22 a23a20 a21 a22 a23 上面定义的二维数组可以理解为定义了三个一维数组,即上面定义的二维数组可以理解为定义了三个一维数组,即相当于相当于 f1oat a04,a14,a24f1oat a04,a14,a24此处把此处把
66、a0,a1,a2a0,a1,a2看作一维数组名看作一维数组名。c c语言的这种处理语言的这种处理方法在数组初始化和用指针表示时显得很方便,这在以后会方法在数组初始化和用指针表示时显得很方便,这在以后会介绍。介绍。 机电系统控制电路设计2024/8/23872.2.二维数组的引用二维数组的引用6数组及指针数组及指针二维数组二维数组二维数组二维数组数组名数组名行下标 列下标; 如:a23,数组元素可出现在表达式中,也可被赋值如: a12= a02/2。n 注意:下标值应在已定义的数组大小的范围内。 如:a23错了,其最大下标为1和2。机电系统控制电路设计2024/8/23883.3.二维数组的初始
67、化二维数组的初始化6数组及指针数组及指针二维数组二维数组二维数组二维数组1 1)分行初始化。如:)分行初始化。如:static int a34=1,2,3,4,5,6,7,8,9,10,11,12;static int a34=1,2,3,4,5,6,7,8,9,10,11,12;2 2)按数组排列的顺序将所有数据写在一个花括号内。如:)按数组排列的顺序将所有数据写在一个花括号内。如:static inta34=1,2,3,4,5,6,7,8,9,10,11,12;static inta34=1,2,3,4,5,6,7,8,9,10,11,12;3 3)部分元素初始化。如:)部分元素初始化。如
68、:static int a34=1,0,6,0,0,11;static int a34=1,0,6,0,0,11;4 4)如果对全部元素都赋初值,则定义数组时可以不指定)如果对全部元素都赋初值,则定义数组时可以不指定 第一维的长度。如:第一维的长度。如:static int a4=1,2,3,4,5,6,7,8,9,10,11,12;static int a4=1,2,3,4,5,6,7,8,9,10,11,12;机电系统控制电路设计2024/8/23896数组及指针数组及指针字符数组字符数组字符数组字符数组 C语言没有字符串变量,语言没有字符串变量,可以定义字符数组,每个可以定义字符数组,每
69、个元素存放一个字符元素存放一个字符,从而达到存放字符串的目的。,从而达到存放字符串的目的。字符数组的定义字符数组的定义char 数组名数组名下标下标;char a10,b212;字符数组的初始化字符数组的初始化一维数组赋初值一维数组赋初值: :用单个字符对每一个元数赋值用单个字符对每一个元数赋值。char str15= h, e, l, l, o;把把5个字符分别赋给个字符分别赋给str10str4这这5个元素个元素机电系统控制电路设计2024/8/2390注意:注意:v如果花括弧中提供的初值个数(即字符个数)大于数组长如果花括弧中提供的初值个数(即字符个数)大于数组长度,则作语法错误处理。如
70、:度,则作语法错误处理。如: char str14= char str14= h h, , e e, , l l, , l l, , o o; ; ERROR!ERROR!v如果初值个数小于数组长度,则只将这些字符赋给数组中如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,前面那些元素,其余的元素自动为空字符其余的元素自动为空字符( (即即00) )。 char str110= char str110= h h, , e e, , l l, , l l, , o o;v如果初值个数与预定的数组长度相同,在定义时可以省略如果初值个数与预定的数组长度相同,在定义时可以省略数组的长度,
71、系统会自动根据初值个数确定数组长度。数组的长度,系统会自动根据初值个数确定数组长度。 char str1= char str1= h h , ,e e , ,l l , ,l l, , o o;等价于:等价于:char str15= char str15= h h, , e e, , l l, , l l, , o o;helloStr1Str1在内存中的存放形式:在内存中的存放形式: 注:一般情况下,说明数组时,注:一般情况下,说明数组时,长度指定应至少比实际长度指定应至少比实际长度大长度大1 1,保证赋初值正确。,保证赋初值正确。机电系统控制电路设计2024/8/23916数组及指针数组及
72、指针字符数组字符数组字符数组字符数组二维数组赋初值二维数组赋初值二维数组的每一行可以存放一个字符串。二维数组的每一行可以存放一个字符串。 char str36=w,a,n,g, , z,h,a,n,g, l,i,u;wang00zhang0liu000str数组在内存数组在内存中存储形式中存储形式机电系统控制电路设计2024/8/23926数组及指针数组及指针字符数组字符数组字符数组字符数组3. 字符数组的引用字符数组的引用可以引用可以引用字符数组中的一个元素字符数组中的一个元素,得到一个字符。,得到一个字符。例:输出一个钻石图形。例:输出一个钻石图形。 main() main() char
73、diamond5= , , *, ,*, ,*, char diamond5= , , *, ,*, ,*, *, , , ,*, ,*, ,*, , ,*; *, , , ,*, ,*, ,*, , ,*; int i,j; int i,j; for(i=0 for(i=0;i5i5;i+)i+) for(j for(j0 0;j5j5;j+)j+) printf(%c,diamondij); printf(%c,diamondij); printf(n); printf(n); * * * * * * *00*000 * 0 * 0 * 000 * 0 * 0 * 000 * 00机电系统
74、控制电路设计2024/8/23934. 字符串和字符串结束标志字符串和字符串结束标志在在C C语言中,语言中,将字符串作为字符数组来处理将字符串作为字符数组来处理。有效字符串的长度:为测定字符串的实际长度,有效字符串的长度:为测定字符串的实际长度,C C语言有一个语言有一个“字符串结束标志字符串结束标志”(00) 。例:有一个字符串,其第例:有一个字符串,其第1010个字符为个字符为00,则此字符串的有效字符为,则此字符串的有效字符为9 9个个。系统对字系统对字符串常量也自动加一个符串常量也自动加一个00作为结束符。作为结束符。在定义字符数组时应估计实际字符串长度,在定义字符数组时应估计实际字
75、符串长度,使数组长度始终使数组长度始终保证大于字符串实际长度保证大于字符串实际长度。 char str1char str16 6= = h h, , e e, , l l, , l l, , o o;系统对字符串常量也自动加一个系统对字符串常量也自动加一个00来作为结束符来作为结束符 例例: : “programprogram”共有共有7 7个字符,但内存中个字符,但内存中占占8 8个字节个字节,最后最后一个字节一个字节00是由系统自动完成的是由系统自动完成的6数组及指针数组及指针字符数组字符数组字符数组字符数组机电系统控制电路设计2024/8/23946数组及指针数组及指针字符数组字符数组字
76、符数组字符数组可以用字符串常量来使字符数组初始化。例如可以用字符串常量来使字符数组初始化。例如: : char c =I am happy; char c =I am happy; 也可以省略花括号,直接写成:也可以省略花括号,直接写成: char c =I am happy; char c =I am happy; 此时数组此时数组c c的长度为多少?的长度为多少?注:数组的注:数组的长度为长度为1111,而不是,而不是1010,这是因为,这是因为字符串常量字符串常量 的最后由系统加上一个的最后由系统加上一个00上面的初始化与下面的初始化等价:上面的初始化与下面的初始化等价:char c =
77、char c =I I, , , , a a, ,m m, , , ,h h, ,a a, ,p p, , p p, ,y y, ,00;4. 字符串和字符串结束标志字符串和字符串结束标志机电系统控制电路设计2024/8/23956数组及指针数组及指针字符数组字符数组字符数组字符数组4. 字符串和字符串结束标志字符串和字符串结束标志需要说明的是需要说明的是: : 1 1)字符数组)字符数组并不要求它的最后一个字符为并不要求它的最后一个字符为0 0,甚至,甚至可以不包含可以不包含0 0。象以下这样写完全是合法的:。象以下这样写完全是合法的: charc5=C,h,i,n,a; charc5=C,
78、h,i,n,a;是否需要加入是否需要加入00,完全根据需要决定。但是只要用字,完全根据需要决定。但是只要用字符串常量就会自动加一个符串常量就会自动加一个0 0。 2 2)人们为了使处理方法一致,便于测定字符串的实际长)人们为了使处理方法一致,便于测定字符串的实际长度以及在程序中作相应的处理,度以及在程序中作相应的处理,在字符数组中也常常人为地在字符数组中也常常人为地加上一个加上一个0 0。如:。如: char c6=C,h,i,n,a,0;char c6=C,h,i,n,a,0;机电系统控制电路设计2024/8/23965. 字符数组与字符串的输入输出字符数组与字符串的输入输出6数组及指针数组
79、及指针字符数组字符数组字符数组字符数组n假设有定义 char a10;1 1)用格式符)用格式符”%c%c”逐个字符逐个字符输入输出输入输出: :scanf(scanf(”%c%c”,&a0);,&a0);printf(printf(”%c%c”, a0); /*, a0); /*每次输入输出一个字符每次输入输出一个字符* */ /2 2)用格式符)用格式符“%s%s”整个字符串输入输整个字符串输入输出出: :char c10char c10;scanf(%sscanf(%s,c)c); /*/*注意此处用数组名注意此处用数组名c*/c*/printf(%sprintf(%s, c)c); /
80、*/*注意此处用数组名注意此处用数组名c*/c*/机电系统控制电路设计2024/8/23975. 字符数组与和字符串的出入输出字符数组与和字符串的出入输出6数组及指针数组及指针字符数组字符数组字符数组字符数组n用用“%s%s”格式输出字符数组时,遇格式输出字符数组时,遇00结束输出,且输出结束输出,且输出字符中不包含字符中不包含00。若数组中包含一个以上。若数组中包含一个以上00,则遇第,则遇第一个一个00时即结束输出。时即结束输出。v 用用“%s%s”格式输入或输出字符数组时,函数格式输入或输出字符数组时,函数scanfscanf的地址的地址 项、项、 函数函数printfprintf的输出
81、项都是字符数组名。这时数组名前的输出项都是字符数组名。这时数组名前 不能再加不能再加“& &”符号,因为符号,因为数组名就是数组的起始地址。数组名就是数组的起始地址。v用语句用语句“scanf (scanf (“%s%s”,s)s);为字符数组;为字符数组s s输入数据时,遇输入数据时,遇空格键或回车键时结束输入。并且所读入的字符串中不包空格键或回车键时结束输入。并且所读入的字符串中不包含空格键或回车键,而是在字符串末尾添加含空格键或回车键,而是在字符串末尾添加00。 v用一个用一个scanfscanf函数输入多个字符串,输入时应以空格键或回车函数输入多个字符串,输入时应以空格键或回车键作为字符串间的分隔。键作为字符串间的分隔。 机电系统控制电路设计2024/8/23986数组及指针数组及指针机电系统控制电路设计浙江省邮电职业技术学院浙江省邮电职业技术学院 求是求是 立德立德 尚学尚学 精业精业