下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言的结构程序的构成:A、C程序由函数构成,函数是C程序的基本单位。程序由一个或多个函数组成,必须有且只能有一个主函数main();程序执行从main开始,在main中结束,其它函数通过嵌套调用得以执行(main函数既可以放在程序的最前头,也可以放在程序最后,或在一些函数之前,或在一些函数之后);B、•个函数又由两部分组成:函数首部和函数体函数的首部,包括函数名、函数返回值类型、函数属性、函数参数名和参数类型:函数体包括两部分,即声明部分和执行部分(两部分是可选的);C、C程序书写格式自由,一行内可以写几个语句,•个语句可以分写在多行上,C程序没有行号;D、每个语句和数据声明的最后必须有一个分号,分号是C语句的必要组成部分,是不可或缺的;E、可以用/* */对c程序的任何部分做注释,注意注释不能嵌套,ー个好的,有使用价值的源程序都应当加上必要的注释,以增加程序的可读性。/*example1.1 calculatethesumofaandb*/#include<stdio.h>/*Thisisthemainprogram*/main(){intab,sum;a=10;b=24;sum=add(a,b);printf(,,sum=%d\nn,sum);)/*Thisfunctioncalculatesthesumofxandy*/intadd(intx,inty){intz;z=x+y;retum(z);
2、数据类型及其运算整数类型整数类型的标识符是into整型数据根据其占用的内存字节数不同,可加限定词:short(短整型),intJong(长整型),short^int^long,可用sizeof(类型标识符)测量unsignedshort(无符号短整型),unsignedht(无符号整型),unsignedbng(无符号长整型),其中short和!ong的引入是为满足实际要求的不同长度的整数,而经unsigned限定词限定的整数总是正的。实数类型实数类型分为单精度(floaい和双精度(double)类型,二者的区别在于所占存储位的多少,从而决定了其取值范围。通常以32位(bits)来存储单精度实数型数据,以64位来存储双精度实型数据。字符类型整型、实型都是数值型,是大家比较熟悉的。除数值型外,还有一类数据是计算机经常处理的数据,这就是字符型。字符型数据包含的是ー个字符集。一般用的是ASCII码字符集;字符集中的每一个字符都有一个序号,称为ASCII码。ASCII码大的字符比ASCII码小的字符值大;字符类型的标识符是char。数组数组:・组同类型的若干个(已知个数)多个相关变量的数据集合,在内存中存放在地址连续的存储单元。.ー维数组的定义定义方式: 数据类型数组名[常量表达式];注意:数组必须先定义,后使用只能逐个引用数组元素,不能一次引用整个数组数组元素表示形式:数组名[下标]其中:下标可以是常量或整型表达式.二维数组的定义定义方式:数据类型数组名[常量表达式][常量表达式];几点注意:①二维数组的下标表达式的范围和一维数组类似,可以是整型的变量、常量、表达式。第一维下标的范围是0、1、2……第一维长度ー1;第二维下标范围是。、1、2第二维长度ー1。在引用每ー个数组元素时下标表达式的值不能越界!②虽然二维数组是特殊的ー维数组,是元素为ー维数组的ー维数组,但并不能引用数组的行或列,只能引用单个是数组元素。③二维数组元素的表示方式不能写为如b[l,2]、b[2],[0]、b(l,2)、b(3)(l)的形式,而且两个下标之间也不能有空格。结构体结构体:是ー种自定义的构造数据类型。用途:把不同类型的数据组合成一个整体定义:struct [结构体名](类型标识符 成员名;类型标识符 成员名;I:联合体定义union联合体名(类型标识符 成员名;类型标识符 成员名;):自定义类型typedef用typedef定义已知类型功能:用自定义名字为已有数据类型命名类型定义简单形式: typedeftypename;指针类型c程序设计中使用指针可以:使程序简洁、紧凑、高效有效地表示复杂的数据结构动态分配内存得到多于ー个的函数返回值指针变量的定义一般形式:[存储类型]数据类型・指针名;零指针:(空指针)定义:指针变量值为零表示:int*p=0;void・类型指针表示:void*p;使用时要进行强制类型转换算术运算符关系运算符逻辑运算符算术运算符关系运算符逻辑运算符C 位运算符铲 赋值运算符n,条件运算符算符\ 逗号运算符指针运算符求字节数C语言运算符(+-*/%++--)(〈〈ニ —— 〉 )二((!&&||)(«»〜|へ&)(二及其扩展)(?:)(,)(*&)(sizeof)强制类型转换:(类型)分量运算符:(.-»下标运算符:(ロ)I其它:(()-)不同类型数据间的转换★隐式转换♦:♦什么情况下发生运算转换 不同类型数据混合运算时赋值转换 把一个值赋给与其类型不同的变量时输出转换 输出时转换成指定的输出格式函数调用转换 实参与形参类型不一致时转换❖运算转换规则:不同类型数据运算时先自动转换成同一类型★显式转换(强制转换)0一般形式:(类型名)(表达式)例(int)(x+y)(int)x+y(double)(3/2)(int)3.60说明:强制转换得到所需类型的中间变量,原变量类型不变2.2.2、算术运算符基本算术运算符:+-*/%•结合方向:从左向右•优先级:——>*/%ーー>+-+算术表达式是用算术运算符、圆括号将运算对象连接起来的符合c语言的语法规则的式子。其中,运算对象可以是常量、变量、表达式、函数等等。❖书写时注意以下几点:①C表达式中的乘号不能省略。例如:数学式b2-4ac 相应的C表达式应写成:b*b-4*a*c②C表达式中只能使用系统允许的标识符。例如:数学式nr2 相应的C表达式应写成:3.14159*r*r③C表达式中的内容必须书写在同一行,不允许有分子分母形式,必要时要利用圆括号保证运算的顺序。例如:c+d相应的C表达式应写成:(a+b)/(c+d)④C表达式不允许使用方括号和花括号,只能使用圆括号来帮助限定运算顺序。可以使用多层圆括号,但左右括号必须配对,运算时从内层圆括号开始,由内向外依次计算表达式的值赋值运算赋值运算符、赋值表达式❖简单赋值运算符:=♦赋值表达式•格式:变量标识符=表达式•作用:将赋值号右边的表达式计算出来,将其值赋给左边的ー个变量。❖复合赋值运算符•种类:+=-=*=/=%=《=》=&=』1=•含义:explop=exp2Iexpl=explopexp2赋值运算符的优先级和结合性❖优先级:14❖结合方向:自右向左•左侧必须是变量,不能是常量或表达式•赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型关系运算符和关系表达式关系运算符•种类:v<= ==>= > !=•结合方向:自左向右•关系表达式的值:是逻辑值“真”或“假”,用1和0表示条件运算符与表达式一般形式:exprl?expr2:expr3执行过程功能:相当于条件语句,但不能取代一般if语句逗号运算符和表达式形式:表达式1,表达式2, 表达式n结合性:从左向右优先级・15逗号表达式的值:等于表达式n的值用途:常用于循环for语句中三、基本语句常用输入与输出函数▲C语言无I/O语句,I/O操作由函数实现▲ftinclude<stdio.h>>格式输出函数格式:printf(“格式控制串”,输出表列);功能:按指定格式向显示器输出数据返值:正常,返回输出字节数;出错,返回EOF(-1)输出表列:要输出的数据,通常是表达式,可以没有,多个时以“,”分隔)格式控制串:包含两种信息:格式说明: %[修饰符]格式字符一用于指定所输出的表达事的格式;普通字符或转义序列:原样输出;
格式字符:格式符:十进制整inta=567;printf("%d”,a);十六进制无符号整inta=255;printfC4%x,\a);ハ进制无符号整inta=65;printf("%o'',a);不带符号十进制整inia=567:printi(%u,a);单一字v1ictlu一11111\/PC,U丿,printf(“,ゼ’,"ARr"); _字符 floata=567.789;printf("%e”,a);指数形式浮点小floata=567.789;printf(*l%r,a);小数形式浮点小floata=567.789;printf('4%g'',a);e和f中较短ーprintf(“%%”);百分号本附加格式说明符(修饰符)
修饰符功 有足m输出数据域宽,数据长度<m,左补空格;否则按实际输出,n对实数,指定小数点后位数(四舍五入)对字符串,指定实际输出位数-输出数据在域内左对齐(缺省右对齐)+指定在有符号数的正数前显示正号(+)0输出数值时指定左面不使用的空位:a自动填〇#在ハ进制和十六进制数前显示前导〇,Ox1在d,〇,X,u前,指定输出精度为long型在e,f,g前,指定输出精度为double型、格式输入函数格式:scanf(“格式控制串”,地址表)功能:按指定格式从键盘读入数据,存入地址表指定的存储单元中,并按回车键结束返值:正常,返回输入数据个数附加格式说明符(修饰符)修饰功 負巨h用于d,〇,x前,指定输入为short型整数1用于d,〇,x前,指定输入为long型整数1用于e,f前,指定输入为double型实数m指定输入数据宽度,遇空格或不可转换字符则结束*抑制符,指定输入项读入后不赋给变量33、C语句语句是向计算机发出指令的基本单位,是c程序的重要组成部分,它表示程序执行的步骤,实现程序的功能。c语句用来完成一定的操作任务,ー个C语句经编译后一般会产生若干条机器指令。但是,声明部分内容不产生机器指令,只是对变量或被调函数的声明,因此严格来说不是语句。C语句以分号“;”结尾书写自由,一行多条语句或一语句拆成多行。语句之间用”隔开就可以了。C语句分类表达式语句:表达式加分号构成;函数调用语句: 函数名(实际参数表);复合语句:用{…}括起来的ー组语句一般形式:{ [数据说明部分;]执行语句部分;)说明:“ド后不加分号,语法上和单ー语句相同,复合语句可嵌4选择流程设计>if语句(条件选择语句)■if语句的三种形式•形式ー:格式:if(expression)
statement执行过程:•形式ニ:格式:if(expression)statement1elsestatement2执行过程:♦形式三:格式:if(ecprl) statement1elsefexpr2) statement2elsefexpr3) statements[dse statementn]执行过程:>嵌套IF(if与else或者成对出现,或者只有if条件为真时执行的语句体):if(exprl)ifexpr?)statement1else statement?elseif(expr3)statement?else statement4if~dse配对原则:缺省{}时,else总是和它上面离它最近的未配对的if配对>switch语句(开关分支语句)一般形式:switch(表达式){caseEl:语句组1;break;caseE?:语句组?;break;caseEn:语句组n;break;[default:语句组;
break;]说明:El,E2,…En是常量表达式,且值必须互不相同语句标号作用,必须用break跳出case后可包含多个可执行语句,且不必加{}switch可嵌套多个case可共用ー组执行语句5循环型程序设计c语言可实现循环的语句:用goto和if构成循环while语句do~while语句for语句>goto语句一般格式:goto语句标号:标号:语句;说明:不能用整数作标号只能出现在goto所在函数内,且唯一只能加在可执行语句前面限制使用goto语句>while语句一般形式:while(表达式)循环体语句;特点:先判断表达式,后执行循环体说明:循环体有可能一次也不执行循环体可为任意类型语句下列情况,退出while循环♦条件表达式不成立(为零)♦循环体内遇break,return,goto•无限循环:while(l)循环体;>do~while语句❖一般形式:do循环体语句;while(表达式);。特点:先执行循环体,后判断表达式。说明:至少执行一次循环体do~while可转化成while结构>for语句❖一般形式:for([exprl];[expr2];[expr3])循环体语句;❖说明:for语句中exprl,expr2,expr3类型任意,都可省略,但分号:不可省无限循环:for(;;)for语句可以转换成while结构>循环的嵌套三种循环可互相嵌套,层数不限外层循环可包含两个以上内循环,但不能相互交叉.:.嵌套循环的执行流程嵌套循环的跳转嵌套循环的跳转禁止:从外层跳入内层跳入同层的另ー循环向上跳转>break语句•功能:在循环语句和switch语句中,终止并跳出循环体或开关体•说明:break只能终止并跳出最近一层的结构break不能用于循环语句和switch语句之外的任何其它语句之中>continue语句❖功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断❖仅用于循环语句中6数组>ー维数组定义方式: 数据类型数组名[常量表达式];元素引用数组元素表示形式:数组名[下标]其中:下标可以是常量或整型表达式初始化:说明:数组不初始化,其元素值为随机数对static数组元素不赋初值,系统会自动赋以〇值只给部分数组元素赋初值当全部数组元素赋初值时,可不指定数组长度例:inta[5]={12,3,4,5};>二维数组❖定义方式:数据类型数组名[常量表达式][常量表达式]❖数组元素的存放顺序原因呐存是ー维的二维数组:按行序优先多维数组:最右下标变化最快初始化:分行初始化:例:inta⑵[3]={{1,2],{4]];按元素排列顺序初始化:例:inta[2][3]={1,2,4];元素引用二维数组的访问也是通过访问其元素来实现的。二维数组的引用方式为:数组名[下标表达式][下标表达式]几点注意:①二维数组的下标表达式的范围和一维数组类似,可以是整型的变量、常量、表达式。第一维下标的范围是0、1、2……第一维长度-1:第二维下标范围是。、1、2……第二维长度ー1。在引用每ー个数组元素时下标表达式的值不能越界!②虽然二维数组是特殊的ー维数组,是元素为ー维数组的ー维数组,但并不能引用数组的行或列,只能引用单个是数组元素。③二维数组元素的表示方式不能写为如b[l,2]>b[2],[0]、b(l,2)、b(3)(l)的形式,而且两个下标之间也不能有空格。>字符数组字符数组的定义和使用字符数组就是数据类型为“char”的数组.定义charc[10],ch[3][4];字符数组的初始化❖和前面所讲的数组相同,逐个字符赋值例charch[]={'H',,e',T,T,,o'};例charch[]="Hello";字符串是作为ー个整体对待的字符序列。在C语言中,没有字符串这种数据类型,因此可以将字符串存放在字符数组中。这是处理字符串的方法之一.在用字符数组存放字符串时,字符数组必须预先设定足够的长,在足够长的情况下我们一般并不关心数组的具体长度,而是关心有效字符的长度。对于字符串,并不显式的保存它的长度,而是用字符串结束标志来表示字符串到此结束,隐含着字符串的长度,字符串结束标志也就是前面所介绍的空字符、〇’。对于含有n个字符的字符串在内存中占n+1个字节的空间,因为需要用一个字节来存放字符串结束标志ヘ0’。”"表示空串,在内存中保存的是空字符へ。’,占ー个字节。二维字符串例:charfruit[][7]={"Apple'',''0range",“Grape","Pear","Peach");字符串处理函数常用字符串处理函数包含在头文件string.h字符串输出函数puts格式:puts(字符数组)功能:向显示器输出字符串(输出完,换行)说明:字符数组必须以ヘ〇’结束字符串输入函数gets格式:gets(字符数组)功能:从键盘输入ー以回车结束的字符串放入字符数组中,并自动加‘、0’说明:输入串长度应小于字符数组维数字符串连接函数strcat格式:strcat(字符数组1,字符数组2)功能:把字符数组2连到字符数组1后面返值:返回字符数组1的首地址说明:字符数组1必须足够大连接前,两串均以‘、0'结束;连接后,串1的‘'0'取消,新申最后加''0'♦字符串拷贝函数strcpy格式:strcpy(字符数组1,字符串2)功能:将字符串2,拷贝到字符数组1中去返值:返回字符数组1的首地址说明:字符数组1必须足够大拷贝时ヘ0'一同拷贝不能使用赋值语句为ー个字符数组赋值♦字符串比较函数strcmp格式:strcmp(字符串1,字符串2)功能:比较两个字符串比较规则:对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或‘、。’为止返值:返回int型整数,a.若字符串1<字符串2,返回负整数b.若字符串1>字符串2,返回正整数c.若字符串!==字符串2,返回零说明:字符串比较不能用“==",必须用strcmp♦字符串长度函数strlen格式:strlen(字符数组)功能:计算字符串长度返值:返回字符串实际长度,不包括‘、。’在内其他的还有:char*strchr(char*s,charc);char*strpbrk(char*sl,char*s2);(返回s2任何字符第一次出现的位置)char*strstr(char*haystack,char*needle);(返回needle第一次出现的位置)七、函数.库函数的正确调用。.函数的定义方法。★.函数的类型和返回值。★.形式参数与实在参数,参数值的传递。★.函数的正确调用,嵌套调用,递归调用。.局部变量和全局变量。.变量的存储类别(自动,静态,寄存器,外部),变量的作用域和生存期。概述:模块化程序设计基本思想:将一个大的程序按功能分割成一些小模块,特点:各模块相对独立、功能单ー、结构清晰、接口简单控制了程序设计的复杂性提髙元件的可靠性缩短开发周期避免程序开发的重复劳动易于维护和功能扩充开发方法:自上向下,逐步分解,分而治之C是函数式语言必须有且只能有一个名为main的主函数C程序的执行总是从main函数开始,在main中结束函数不能嵌套定义,可以嵌套调用函数分类从用户角度:标准函数(库函数):由系统提供用户自定义函数从函数形式:无参函数有参函数.库函数的正确调用。使用库函数应注意:(1)函数功能(2)函数参数的数口和顺序,及各参数意义和类型
(3)函数返回值意义和类型(4)需要使用的包含文件〔、〔、(n.k尸 k!(n-k)!例7.1编写程序计算组合数:#include*stdio.h"main()つ;/つ;/・输入n、k的值・//・三次调用函数fac,求n!、k!、(n-k)!*//・输出计算结果・//・计算ー个整数的阶乘・/printfC/\npleaseinput(n,k)scanf(z/%d,%d〃,&n,&k);c=fac(n)/(fac(k)*fac(n-k));printf('\nC(n,k)二%d",c);}intfac(intm){inti,s=l;for(i=l;i<=m;i++)s*=i;return(s);.函数的定义方法。★5.1.1一般格式现代风格:§5.1函数的定义函数返回值类型缺省血型无返回值void合法标识替)5.1.1一般格式现代风格:§5.1函数的定义函数返回值类型缺省血型无返回值void合法标识替)函数类型函数名(形参类型说明表)说明部分
语句部分函数体例无参函数BrintstarO{prinifT“**********\n");)或例无参函数BrintstarO{prinifT“**********\n");)或BrintstM;(void){print気“**********\n");)例有参函数(现代风格)intmax(intxjnty){intz;z=x>y?x:y;retum(z);}入例有参函数(现代风格)intmax(intx?y){intz;z=x>y?x;y;retum(z);}例空函数dummy()(}函数体为空)例?.2编写函数,求三个整型参数的最大值。intmax(intxl,intx2,intx3) /・定义函数的返回值类型,函数名,形参・/{intmax;if(xl>x2)max=xl;elsemax=x2;if(max<x3)max=x3; /・通过比较得到三个数的最大值放到max中*/return(max); /・返回运算结果・/).函数的类型和返回值。★返回语句形式:return(表达式);或 return表达式;或 return;功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数说明:函数中可有多个return语句若无return语句,遇到函数结束的“}'’时,自动返回调用函数若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换 函数调用转换void型函数:无返回值的函数例 无返回值函数(返回后,带来不确定的值,与返回值void相区别)printstarO{printfTprintstarO{printfTH**********“)・),mainQ{inta;a=printstarO;printf(,,%d"Ja);)voidprintstarO{pHntf。**********''アmainQ{inta;a=printstarO;prin氓"%d",a);}输出:输出:10编译错误!.形式参数与实在参数,参数值的传递。★函数定义中的参数是形式参数,函数的调用者提供给函数的参数叫实际参数。在函数调用之前,实际参数的值将被拷贝到这些形式参数中。C语言中,函数调用是值传递方式,即函数的实际参数和形式参数之间的数据传递方向是单向的,只能由实际参数传递给形式参数,而不能由形式参数传递给实际参数,是实际参数向形式参数单向赋值的关系。
在内存中,形式参数与实际参数占用不同的内存单元。当调用函数时,给形式参数分配内存单元,将实际参数的值赋值给形式参数,调用后,形式参数单元释放,实际参数仍保留调用前的值,形式参数值的变化不影响实际参数。参数传递方式・值传递方式★方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值★特点:★形参与实参占用不同的内存单元★单向传递・如何实现“地址传递”?★只能是:函数调用时,将数据的存储地址作为参数传递给形参,当然此时的行参只能是能存储地址的变量(指针变量)。才能达到“双向”传送的目的O#include<stdio.h>mainO{inta=3,b=5;printfCca=%d,\tb=%d\n",a.b);printfCswapped:^");swap(a,b);printf("a=%d,\tb=%d\ir,a,b);)#include<stdio.h>mainO{inta=3,b=5;printfCca=%d,\tb=%d\n",a.b);printfCswapped:^");swap(a,b);printf("a=%d,\tb=%d\ir,a,b);)swap(intx,inty){inttemp;temp=xixプy=tempi}调用前:调用swap:调用结束:a:a:a:5a:国b:[J]swap(pl,p2)int*pl,*p2;{intp;调前:p=*pl;*pl=*p2;*p2=p:swap(pl,p2)int*pl,*p2;{intp;调前:p=*pl;*pl=*p2;*p2=p:调swap)mainO{inta.b;scanf("%d,%dl,.&a.&b);printf(tta=%d,b=%d\n,\a,b);頭ntf("swapped:\n");交换:swap(&2L&b);printf(,,a=%dab=%d\n25a3b);返回:)pl□bavoida(int); /*注意函数声明的形式・main(){intnum;scanf(\"%d\",&num);a(num); /・注意调用形式・/)voida(intnum_back)/・注意定义形式・/(printf(\"%d\\n\",num_back);)❖说明:实参必须有确定的值形参必须指定类型形参与实参类型一致,个数相同若形参与实参类型不一致,自动按形参类型转换 函数调用转换形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放.函数的正确调用,嵌套调用,递归调用。调用形式: 函数名(实参表)函数语句:函数调用可単独成为ー个语句例output();;printf(*lHello,World!\n");函数表达式:调用函数后的返回值可参加表达式的计算,这时要求被调函数带返回值。例sum=add(a,b);c=fac(n)/(fac(k)*fac(n-k));函数参数:带返回值的函数调用亦可作为其它函数的参数(实际参数)例printf("%d”,max(a,b));m=max(a,max(b,c));(嵌套调用)longfact(intn){longf;if(n==0||n==l)f=l; /・递归控制・/elsef=n*fact(nT); /・递リI调用・/return(f);)对于函数的位置:对于非int函数,调用单位的位置要在被调用单位在下面,否则编译产生错误。解决方法是:在调用单位加上被调用函数的声(说)明。voidf()()|/main(){...fo;)tlmain(){voidf();JO;...main()(voidf()(voidR)f():}}2 函数说明对被调用函数要求:必须是已存在的函数库函数:#include<*.h>用户自定义函数:函数类型说明函数说明一般形式: 函数类型 函数名(形参类型[形参名],…);或 函数类型 函数名();作用:告诉编译系统函数类型、参数个数及类型,以便检验;函数定义与函数说明不同;函数说明位置:程序的数据说明部分(函数内或外);下列情况下,可不作函数说明:若函数返值是char或int型,系统自动按int型处理;被调用函数定义出现在主调函数之前;有些系统(如BorlandC++)要求函数说明指出函数返值类型和形参类型,并且对void和int型函数也要进行函数说明/**/main(){floataid(float,float);/*functiondeclaration*/floata,b,c;scanf(n%f,%f;&a,&b);c=add(a,b);printf(Msumis%f',c);)floatadd(floatx,floaty){floatzz=x+y;retum(z);)/**/main(){floatab;intc;scanf("%f,%r:&a,&b);c=max(a,b);〃返回值为整形,可以不作函数申明printf(MMaxis%d\nH,c);)max(floatx,floaty){floatzz=x>y?x:y;return(z);}/**/floatadd(floatx,floaty){floatzz=x+y;retum(z);}main(){float4b,c;scanf("%f,%r,&a,&b);c=add(a,b);〃被调函数出现在住调函数之前可以不作函数申明printf(Hsumis%f\c);}.局部变量和全局变量。变量是对程序中数据的存储空间的抽象。!生存周期不同作用范围不同分配方式不同安全感不同用途不同!变量的属性数据类型:变量所持有的数据的性质(操作属性)存储属性存储器类型:寄存器、静态存储区、动态存储区生存期:变量在某ー时刻存在 静态变量与动态变量作用域:变量在某区域内有效 局部变量与全局变量变量的存储类型auto 自动型register 寄存器型static 静态型extern 外部型变量定义格式:[存储类型] 数据类型 变量表;如: intsum;autointa,b,c;registerinti;staticfloatx,y;从作用域角度考虑分为:内部变量、外部变量内部变量(局部变量)的作用域:是定义它的函数内或复合语句内,在它的作用域之外,内部变量是不可见的,也就是说,ー个函数内定义的内部变量是不能被其它的函数所引用的。特性:有助实现信息隐蔽,即使不同的函数定义了同名的内部变量,也不会相互影响。内部变量一一局部变量❖定义:在函数内定义,只在本函数内有效❖说明:♦main中定义的变量只在main中有效♦不同函数中同名变量,占不同内存单元形参属于局部变量可定义在复合语句中有效的变量局部变量可用存储类型:autoregisterstatic (默认为auto)
floatfl(inta)floatfl(inta)abc有效charf2(intx,inty){intij:x,y,ij有效}main(){intm.n:,m,n有效)例不同函数中同名变量mainO{inta.b;a=3;例不同函数中同名变量mainO{inta.b;a=3;b=4;pHntf("main:a=%d,b=%d迫":&b);subO;prinWmain:a=%d,b=%d\n"ab);subO{inta.b;a=6;b=7;运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4printf(,,sub:a=%d,b=%d\n":a:b);复合语句中变量#defineN5mainO{inti;inta[N]={1,2,3,4,5);fbr(i=0;i<N/2;i-H-){inttemp;temp=a[i];a[i]=a[N-i-l];a[N-i-l]=temp:}fbr(i=O;i<Nn-H-)printf("%d",a[i]);}运行结果:54321外部变巾(全局变量)定义:在函数外面定义的变量。外部变量的作用域:対于只有一个源程序文件构成的程序,外部变量的作用域是从定义它的位置开始,直至它所在源程序文件的结束。特点:外部变量的使用增加了函数之间传递数据的途径,在外部变量的作用
域内的任何函数都能引用该外部变量,ー个函数对外部变量的修改,能影响到其它引用这个变量的函数;因此对外部变量的使用不当,会产生意外的错误。floatmax,min; floataverage(intn){inti;floatx;scanf("%f',&x);max=min=x;for(i=2;i<n;i++){scan氏"%f',&x);if(x>max)max=x;elseif(x<min)min=x;sum+=x;}retum(sum/n);}mainO{intn;floatave;scanf("%d'',&n);ave=average(n);printf(',max=%6.2f\nmin=%6.2f\naverage=%6.2f\n',Jmax,min.ave);1maxmin作用域f外部变量与局部变量同名时,在内部变量的作用域中,外部变量被屏蔽。运行结果:a=8/*main运行结果:a=8/*main中的a*/b=5/*main中的b*/max=8max(inta,intb){intc;c=a>b?a:b;retum(c);}mainO{inta=8;printf("a=%d\n,b=%d\n,max=%d\n",a,b,max(a,b));)外部变量使用不当时,会引起副作用。外部变量使用不当时,会引起副作用。运行结果:*****运行结果:*****mainO{voidprtO;for(i=0;i<5;i++)prtO;}voidprtO{fbr(i=O;i<5;i++)print出"%c",'*');printf("\n'');}用用extern扩展外部变量作用域例子:运行结果:x=0 y=0x=135 y=246x=135 y=246main(){voidgxQ,gy();externintx?y;prints1:x=%d\ty=%d\n,,.x,y);y=246;gx();gy();)voidgxO{externiotx.y;x=135;printf(u2:x=%d\ty=%d\n,,.x.y);}intx:y;voidgy(){print及“3:x=%d\ty=%d\n,\xry);)7.变量的存储类别(自动,静态,寄存器,外部),变量的作用域和生存期。★变量存储类型タト"&卩变量存储类别autoregister局部static外部staticタト君卩存储方式动态静态存储区动态区哥存器铮态存储区生存期函数调用开始至结竦程序整个运行期间作用域定,义变量的函数或复合语旬内本文件其它文件賦,初值每次函数调用时编译时賦初值,只賦一次未賦初值不确定自动赋初值〇或空字符♦局部变量默认为auto型♦register型变量个数奥限,且不能为long,double,float型♦局部static变量具有全局寿命和局部可见性♦局・部static变量具有可继承性♦extern不是变量定义,可扩展外部变量作用域
变量的存储类别 动态变量与狰态变量♦:♦动セ变量:动态存储类别的变量当进入定义它的函数或复合语句时被分配存储空间,当离开时所占内存空间被释放。❖静态变量:静态存储类别的变量在源程序编译的时候被分配固定的存储空间,从程序开始执行到程序运行结束,一直占用该内存空间,直至程序运行结束,オ被释放内存空间。♦:♦生存期 程用唇态变量:动态变量:籽态存储区动态存储区变量存在(在内存有存储空间)的时间段。从程序开始执行到程序结束从包含该变量定义的函数开始执行至函数执行结束< 1全局变量、局部静,セ变量(形参变量く 1,局部动态变量(autoregister)函数调用现场保护和返回地址等内部变量的存储类别内部变量的作用域是定义它的函数或复合语句。内部变量的存储类别是指它存放的位置。内部变量可存放于内存的动态区,寄存器和内存的静态区。但无论内部变量存放在何处,它的作用域是不变的。内部变量可以定义为:自动的(auto)"寄存器(register寄存器(registerA动态变最静态的(静态的(static)静态变量自动的(auto):在函数内定义的变量都是自动的。main(){inta; /・等价于:autointa;*/寄存器变量(register)如:registerinti;〃这只是对编译器的一种推荐,不代表i一定会存放在寄存器中staic变量在内存的静态存储区占用的固定的内存单元;即使它所在的函数被调用结束后,也不释放存储单元,它所在单元的值也会继续保留——因此:下次再调用该函数时,staic变量仍使用原来的存储单元,仍使用原来存储单元中的值。虽然staic变量在整个程序运行期间都是存在的,但在它的作用域外,它是不可见的,也就是说其它函数是不能引用它的。例局部静态变量值具有可继承性mainO{voidincrement(void);mainO{voidincrement(void);incrementO;incrementO;incrementO:}voidincrement(void){intx=0;x++;print出"%d\n”,x);运行结果:111mainQ{voidincrement(void);increment();increment();incrementO;}voidincrement(void){staticintx=0;X++;print氏"%d\n”,x);}运行结果:123ハ、编译预处理.宏定义和调用(不带参数的宏,带参数的宏)。★★作用:对源程序编译之前做ー些处理,生成扩展c源程序★种类宏定义 #define文件包含 finclude条件编译 «if—ftelse—#endif等★格式:❖“第‘开头♦:.占单独书写行语句尾不加分号★不带参数宏定义一般形式: #define宏名[宏体]❖功能:用指定标识符(宏名)代替字符序列(宏体)❖定义位置:任意(一般在函数外面)作用域:从定义命令到文件结束#undef可终止宏名作用域格式: #undef 宏名宏展开:预编译时,用宏体替换宏名一ー不作语法检查引号中的内容与宏名相同也不置换宏定义可嵌套,不能递归宏定义中使用必要的括号()说明:①宏名一般用大写字母。这不是语法规定,只是一种习惯。②可以使用宏名代替ー个字符串③当宏定义在一行中写不下,需要在下一行继续时,只需在最后ー个字符后紧接ー个反斜线例如:ttdefineLEAP_YEARyear%4==0\&&year%100!=0I|year%400==0注意在第二行开始不要有空格,否则空格会ー起被替换。④宏名的有效范围为定义命令之后到本源文件结束,除非用#undef命令终止宏名的作用域。⑤对程序中用双引号括起来的字符串内的子串和用户标识符中的成分不做替换。⑥同一个宏名不能重复定义。★带参数宏定义。一般形式:#define宏名X参数表)宏体例#defineS(a6:7 能加空邑っarea=S(3,2); //宏展开: area=3*2;♦:♦宏展开:形参用实参换,其它字符保留♦3宏体及各形参外一般应加括号〇例#defineS(r)Pl*r*r相当于定义了不带参宏S,代表字苻串“(r) Pl*r*r"例#definePOWER(x)x*xx=4;y=6;z=POWER(x+y);宏展开:z=x+y*x+y;一般写成:#definePOWER(x)((x)*(x))宏展开:z=((x+y)*(x+y));
例用宏定义和函数实现同样的功能#defineMAX(x,y)(x)>(y)?(x):(y)intmax(y){return(x>y?x:y);main()}{inta,b,c,d,t;main()t=MAX(a+b,c+d);{inta,b,c,d,t; t=max(a+b,c+d);)宏展开:t=(a+b)>(c+d)?(a+b):(c+d);)じ♦带参的宏与函数区别帝l参宏函数小理时间编译时程序运行时参数类型无类型问题定义实参,形参类型处理过程不分酉己内存简单的字符置换分配内存先求实参值.再代入形参程序长度变长不变运行速度不占运行时间调用和返回占时间2.“文件包含”处理。文件包含★功能:ー个源文件可将另ー个源文件的内容全部包含进来★一般形式:ttinclude “文件名”或ttinclude く文件名〉〇直接按标准目录搜索;先在当前目录搜索,再搜索标准目录可指定路径★处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译file2.c#include"fHe2.c”file2.cfile2.cfilel.c★被包含文件内容♦:♦源文件(*.C)♦:♦头文件(*.h)宏定义数据file2.cfilel.c★被包含文件内容♦:♦源文件(*.C)♦:♦头文件(*.h)宏定义数据结构定义函数说明等★文件包含可嵌套filel.c#include“file2.c”//include“file3.c”file3.cfilel.cfile2.c例文件包含举例/*powers.h*/例文件包含举例#definesqr(x)((x)*(x))#definecube(x)((x)*(x)*(x))#definequad(x)((x)*(x)*(x)*(x))/*ch8_10.c*/#include<stdio.h>//include"d:\fengyi\bkc\powers.h"#defineMAX_POWER10voidmainQ{intn;printf("number\texp2\texp3\texp4\n");print里—\t—\t \t \n")jfbr(n=l;n<=MAX_POWER;n++)printf(",%2d\t%3d\t%4d\t%5d\n",n,sqr(n),cube(n),quad(n));九、指针i.地址与指针变量的概念,地址运算符与间址运算符。指针变量与其所指向的变量之间的关系ipointer 变量ii<=>*ipointer2000 • 3&k〇ipointeri=3;*iDointer=3 エ ---一,-一-
1、地址的概念内存中每个字节有一个编号一一地址i_pointer--一指针变量,它的内容是地址量*i_pointer-一指针的目标变量,它的内容是数据&i_pointer-一指针变量占用内存的地址i_pointer=&i=&(*i_pointer)i=*i_pointer= *(&i)❖直接访问:按变量地址存取变量值❖间接访问:通过存放变量地址的变量去访问变量
指针变量必须先赋值,再使用例main(){inti=10;int*p;*p=i;printf("%d",*p);例main(){inti=10,k;int*p;p=&k:printf("%d'',*p);2.ー维、二维数组和字符串的以及指向变量、数组、字符串、函数、结构体的指针变量的定义。通过指针引用以上各类型数据。printf("%d'',*p);指向函数的指针:函数在编译时被分配的入口地址(程序段的存储地址)称为函数指针,用函数名表示。我们将这一地址存到ー个指针变量里去,这个变量就是指向函数的指针变量。★指向函数的指针变量❖定义形式:数据类型 (・指针变量名)();如int(*p)();函数指针变量赋值:如p=max;//max是返回值为int的函数函数调用形式:c=max(a,b);<=>c=(*p)(a,b);0c=p(a,b);0对函数指针变量p±n,p++,p--无意义例:编写函数maxn,完成“输入n(nvlO)个整数,找出其中最大数来”的功能。main(){int(*p)();intm,n;p=maxn;scanf(n%d",&n);m=(*p)(n);printf(fcin=%d,max=%d\nM,n,m);maxn(intn){inti,x,max;
scanf(%d,&max);for(i=l;i<n;i++){scanf("%d”,&x);if(max<x)max=x;}retum(max);)关于函数指针的相关说明:I、注意指向函数的指针变量定义的格式2、在给ー个指向函数的指针变量赋值时,不用带参数,如:p=max;而不能p=max(a,b);3、只能给指向函数的指针变量赋值同类型的函数。4、用函数指针变量调用函数时,只需将(*p)代替函数名即可,实参必须写上(若有参数的话»5、指向函数的指针变量可以根据需要指向同类型的不同函数;6、注意指向函数的指针变量的操作。ー维数组:]1J--]]1J--]0123rLrLrLrLaaaaa[9]整型指针p二维数组:inta[3][4];200() ヌ;inta[3][4];200() ヌ;a[0][0],2008aLOj-200:200(a[0][l]a[0][2]a[0][3]ゝ92016c「11a[l][0]a[lj201(201(a[l][l]a[l][2].a[l][3]> -20li[0]a[2][l]a[2][2]42][3]aa+a+:二维数组inta[3][4],有♦a——二维数组的首地址,即第〇行的首地址♦a+i——第i行的省・地址♦a[i]0*(a+i) 第i行第〇列的元素地址♦a[i]+jo*(a+i)+j——第i行第j列的元素地址♦*(a[i]+j)=*(*(a+i)+j)oa[i][j]a+i=&a[i]< ->a[i]=*(a+i)=&a[i][O],值相等,含义不同♦a+io&a[i].表示第i行首地址,指向行♦a[i]<=>*(a+i)<=>&a[i][0],表示第i行第〇列元素地址,指向列表示形式含义地址a二维数组名,数组首地址2000a[O],*(a+O),*a第。行第〇列元素地址2000a+1第1行首地址2008a[l],*(a+l)第1行第〇列元素地址2008a[l]+2,*(a+l)+2,&a[l][2]第1行第2列元素地址2012*(a[l]+2),*(*(a+l)+2),a[l]⑵第1行第2列元素值13
例:二维数组与指针运算mainQ例:二维数组与指针运算{inta[3][4]={{l,2,3,4},{3,4,5,6},{5,6,7,8}};inti;int(*p)[4]=a,*q=a[0];fbr(i=0;i<3;i-H-){if(i=O)(*p)[i+i/2]=*q+l;elsep++,-H-q;}fbr(i=O;i<3;i++)printf("%d,",a[i][i]);printf("%d,%d\n",*((int*)p),*q);运行结果:2,4,7,5,33.用指针作函数参数。★运行结果:2,4,7,5,3swap(intx,inty){inttemp;temp=x;x=y;y=temp;}mainQ{inta,b;scanff%d,%d”,&a,&b);if(a<b)swap(a,b);printf("\n%d3%d\n",a,b);运行结果:5,9
swap(int*pl,int*p2){intp;p=*pl;*pl=*p2;*p2=p;}mainQ{inta,b;int*pointer_l,*pointer_2;scanf("%d,%d",&a,&b);pointer_l=&a;pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);printf("\n%d,%d\n",a,b);}运行结果:9,5字符串与指针:1、字符串表示形式两种方法❖用字符数组实现:main(){charstring[]=44IloveChina!"printf('*%s\n",string);printfC*%s\n",string+7);)2、用字符指针实现main(){char*string="IloveChina!printfC*%s\n",string);string+=7;while(*string){putchar(string[Oj);string++;)}注意:(1)string是ー个存放字符串起始地址的指针变量,不是ー个字符串变量。(2)在程序中出现字符串常量时,系统返回的是ー个起始地址,因此可以将一个字符串常量赋值给ー个字符指针变量。*string="IloveChina**;是错误的!【例】判断字符串是否回文,回文指的是正读和倒读相同。mainO{charc[80],*pa,*pb;intflag=l;printfC\npleaseinputthestring:");gets(c);pa=c; /*pa指向第0个字符・/pb二c;while((*pb)!=‘、〇')pb++;pb--; /*pb指向最后一个字符*/while((pa<pb)&&flag){if(*pa!=*pb)flag=O;else{pa++;pb--;)} /*判断是否回文・/if(flag)printf('\nyes.");elseprintf('\nno.");数组名作函数参数小数组名作函数参数,是地址传递♦3数组名作函数参数,实参与形参的对应关系实参形参数组名数组数组名指针变量指针变量数组指针变量指针变量①数组名做函数的参数,可以定义形参和实参是同类型的大小相等的数组,象例8.16中,实参数组a和形参数组b都是整型的长度为10的•维数组。②一般情况下,为了函数的通用性强,可以不定义形参数组的长度,而另外采用ー个参数来表示数组长度,因为C编译系统并不检查形参数组的大小,只是将实参数
组的起始地址传递给形参数组。例8.17中,没有定义形参数组a的长度,而是用另ー个整型形参n表示其长度。这样,函数就能对不同长度的数组实现既定的功能。③数组名做函数的实际参数时,并不是将所有数组元素的值传递给形参数组,而是传递数组的起始地址,所以形参数组和实参数组是共占内存单元。④函数参数为数组名,当发生函数调用时,并不为形参数组名所对应的形参数组分配空间,而只为形参开辟ー个存放地址的存储单元,用来存放实参数组名所表示的数组的起始地址。也可以向函数传递结构体数组。向函数传递结构体数组与传递其它的数组ー样,实质上传递的是数组的首地址,形参数组与实参数组共占内存单元。4.返回地址值的函数。返回指针的函数(返回值为某指针类型的函数)★函数定义形式:类型标识符 ・函数名(参数表);例int*f(intx,inty)例写ー个函数,求两个int型变量中居于较大值的变量的地址mainO{inta=2,b=3;int*p;p=fl(&a,&b);printf("%d\n",*p);):int*fl(int*x,int*y)(if(*x>*y)returnx;elsereturny;}
例写ー个函数,求两个血型变量中居于较大值的变量的地址mainQ{inta=2,b=3;int*p;p=f3(a,b);prmtf("%d\n,',*p);)int*f3(intx,inty)(if(x>y)return&x;elsereturn&y;5.指针数组,指向指针的指针。★(1)5.指针数组,指向指针的指针。★(1)指针数组(数组的数据元素是指针)❖定义:数组中的元素为指针变量❖定义形式:数据类型・数组名[数组长度说明];例int*p[4];或,main(){char*p[4];或,main(){char*p[4];p[0]="Fortran";p[l]="Lisp";p[2]="Basic";p[3]=NULL;二维数组与指针数组区别:(1)二维数组存储空间固定字符指针数组相当于可变列长的二维数组(2)指针数组元素的作用相当于二维数组的行名但指针数组中元素是指针变量二维数组的行名是地址常量♦:♦指针数组赋值与初始化赋值:main(){chara[]="FortraiT;charb[]='*Lisp";charc[]=nBasic";char*p[4];p[O]=a;p[l]=b;p[2]=c;p[3]=NULL;初始化:main(){char*p[]={"Fortran","Lisp","Basic”.NULL};指向指针的指针:♦:♦定义:指向指针的指针♦:♦ー级指针:指针变量中存放目标变量的地址例int*p;inti=3;Ip=&i;*p=5;P(指针变量)i(整型变量)♦:♦二级指针:指针变量中存放ー级指针变量的地址例int**pl;
int*p2;
inti=3;
p2=&i;
pl=&p2;**pl=5;pl P2(指针变量)i(整型变量)&p2-&i -I3二级指针ー级指针 目标变量二级间接寻址❖二级指针与指针数组的关系int**p 与int*q[10]•指针数组名是二级指针常量•p=q; p+i是q[i]的地址•指针数组作形参,int*q[有int**q完全等价;但作为变量定义两者不同•系统只给p分配能保存ー个指针值的内存区:而给q分配10块内存区,每块可保存一个指针值十、结构体大纲要求:.用typedef说明一个新类型。★.结构体和共用体类型数据的定义和成员的引用。★3,通过结构体构成链表,单向链表的建立,结构点的输出、删除与插入。★到目前为止,我们已经学习了C语言中的基本数据类型以及派生类型(指针和数组)。这ー章我们要学习:(1):月/定义类型typedef:对已有的类型,另外说明一个新的类型标识符。(2):结构体struct:把具有相互关系的不同类型的数据组成一个有机的整体。(3):共用体union:又称为联合体。把几种不同类型的变量共用一段存储空间。用typedef定义已知类型功能:用自定义名字为已有数据类型命名类型定义简单形式: typedeftypename;例如:typedefintINTEGER;inta,b,c;//INTEGERa,b,c;说明:.typedef没有创造新数据类型.typedef是定义类型,不能定义变量.typedef与define不同:definetypedef预编译时处理编译时处理简単字符置换 为已有类型命名10.2结构体类型struct结构体:是一种自定义de构造数据类型。用途:把不同类型的数据组合成一个整体。结构体类型定义:struct[结构体名]I类型标识符 成员名:类型标识符 成员名;说明:1):struct是关键字,不能省略。2):[结构体名],标识符可以省略。3):成员类型可以是基本型或构造型举例:例structstudentintnumcharname[20];charsex;intage;floatscore;charaddr[30];);〃结构体类型定义描述结构的组织形式(图纸),不分配内存内存分配图结构体变量量的定义(1)、先定义结构体类型,再定义结构体变量一般形式:struct结构体名(类型标识符 成员名;类型标识符 成员名:):struct结构体名变量名表列;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30J;);structludentstul,stu2;(2)、定义结构体类型的同时定义结构体变量一般形式:struct结构体名{类型标识符 成员名;类型标识符 成员名;}变量名表列;例structstudent{intnurncharname[20];charsex;intage;floatscore;charaddr[30];}stul,stu2;(3)、直接无名结构体的同时定义结构体变量一般形式:struct(类型标识符 成员名;类型标识符 成员名;}变量名表列; 〃用无名结构体直接定义变量只能一次例struct{intnurncharname[20];charsex;intage;floatscore;charaddr[30];}stul,stu2;几点说明❖结构体类型与结构体变量概念不同•类型:不分配内存; 变量:分配内存•类型:不能赋值、存取、运算; 变量:可以❖结构体成员名(域名)与程序中变量名地位相同结构体可嵌套2、结构体变量的初始化和其他类型的变量相同,在定义结构体变量时赋初值形式ー:struct 结构体名{类型标识符成员名;
类型标识符成员名;};struct结构体名结构体变量={初始数据};例structstudent{intnumcharname[20];charsex;intage;charaddr[30];);structstudentstul={112/*WangIin",'M',19,’200BeijingR)ad''};形式二:struct 结构体名{类型标识符 成员名;类型标识符 成员名;}结构体变量』初始数据};例structstudent{intnumcharname[20];charsex;intage;charaddr[30];}stul={112;fcWangLin",‘M’,19,"200BeijingRoad"};形式三:struct{类型标识符 成员名;类型标识符 成员名;}结构体变量={初始数据};例 struct{intnurncharname[20];charsex;intage;charaddr[30];}stul={112;4WangLin",'M',19,"200BeijingRoad");3结构体变量的引用★引用规则结构体变量不能整体引用,只能引用变量成员例structstudent{ intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stul,stu2;stul.num=10;stu1.sex二'c';可以使用ー个结构体变量给另外一个结构体变量赋值例如:上面的例子中有stul和stu2两个结构体,则可以相互赋值:stul.num=stu2.num;结构体嵌套逐级引用。10.3 共用体union有时需要将几个不同时出现的变量共享一个内存单元,如:将一个整型变量、实型变量、字符型变量共同放入同一个地址空间(当然这几个变量不能同时用),怎么办?c提供了共用体(联合体)类型支持。共用体类型定义形式:union 共用体名(类型标识符成员名;类型标识符成员名;};〃类型定义不分配内存
例uniondata{inti
doublex;);4个字节 4个字节存位 低位共用体成员共用存価m元示XXB310.3.2共用体变量的定义2共用体变量引用❖引用方式:共用体变量名.成员名ぐ二=>共用体指针名一〉成员名<——>(・共用体指针名).成员名例如:uniondata//a.ia.ch a.f{inti//p->ip->chp->fcharch;//(*p).i (*p).ch(*p).ffloatf;//d[0].i d[0].ch d[O].f);uniondataa,b,c,*p,d[3];
引用规则:1.只能引用共用体成员,不能引用共用体。i共用体中起作用的成员只是最后一次存放的成员。例a.i=l;a.ch='a';a.f=1.5;printf(u%d,,,a.i); (x编译通过,运行结果不对).不能在定义共用体变量时初始化例union{inticharch;floatf;}a={l/a\1.5}; (x).可以用•个共用体变量为另一个变量赋值例将一个整数按字节输出main(){unionint_char{inticharch[2];}x;x.i=24897;printf(,,i=%o\n",x.i);printf("chO=%o,chl=%o\nchO=%c,chl=%c\n",
x.ch[O],x.ch[l],x.ch[O],x.ch[l]);}分析:ね」よ一:低セ1O11CXX)O1:0100000101000001O101000001O1100001ch[O]ch[l]运行结果:i=60501ch0=101,chl=141chO=A,chl=a
10.4利用结构体构成单向链表以及对链表的ー些简单操作。.结构体中含有可以指向本结构体的指针成员在前面已经知道结构体中成员可以是各种类型的指针变量。当ー个结构体中有一个或多个成员的基类型就是本结构体类型时,通常把这种结构体称为可以“引用自身的结构体”。例如:structlinkcharch;structlink*p;}a;在这里,p是ー个可以指向structlink类型变量的指针成员,因此,a.p=&a是合法的表达式,由此构成的存储结构如下图:2.単向链表。头指针2.単向链表。头指针头结点head上图是ー个带有头结点的单向链表,下面我们将讨论如何建立这样的单向链表,并且还要对这样的单向链表进行简単的插入、输出结点,以及输出符合条件的链表结点内的内容。结点的类型定义如下:structslistintdata;structslist*next;);typedefstructslistSLIST;(1)建立带头结点的单向链表步骤如下:a)b)c)d)读取数据。a)b)c)d)生成新结点。(SLIST*)malloc(sizeof(SLIST));将数据存入结点的成员变量中。将新结点插入到链表中。重复上述操作直至输入结束。题目:上机实现单向链表的各种操作。(新建、初始化、插入、删除、输出),大纲要求。トー、位运算大纲要求:.位运算符的含义及使用。.简单的位运算。C语言中,位运算的对象只能是整型或字符型数据,不能是其他类型的数据(VC6.0中int型数据占4字节,shortint型数据占2字节,为了便于叙述,本章均以shortint型数据或char型数据为例)。位运算符下表列出了C语言提供的六种位运算符及其运算功能。运算符含义优先级〜按位求反丨"«左移2»右移2&按位与3A按位异或41按位或5低以上位运算符中,只有求“反”运算符(〜)为单目运算符,其余均为双目运算符。各双日运算符与赋值运算符结合可以组成扩展的赋值运算符,见下表:扩展运算符表达式等价的表达式«=a«=2a=a«2»=b»=nb=b»n&=a&=ba=a&bA―aA=ba=aAb1=al=ba=alb位运算符的运算功能“按位取反”运算运算符〜是位运算中唯・的ー个单目运算符,运算对象应置于运算符的右边,其运算功能是把运算对象的内容按位取反,即,使每一位上的。变1,1变〇.例如:表达式〜0115是将ハ进制数115按位取反。-01001101 取反后结果:10110010(ハ进制是0262)“左移”运算左移运算符是双目运算符。运算符左边是移位对象,右边是整型表达式,代表左移的位数。左移时,右端(地位)补〇:左端(高位)移出的部分舍弃。例如:chara=6,b:b=a«2;运算过程:a:00000110(a=6)b=a«2:00011000(b=24=4*6)左移时,可以看出,是与乘法运算等效,但是有条件限制,在左端移出的部分不包含有效二进制1.“右移”运算使用方法与左移运算符ー样,只是移动方向发生变化。右移时,右端移出的二进制数舍弃,左端移入的二进制数分两种情况:対于无符号整数和正整数,高位补0;对于负整数,高位补1.这是因为负数在机器内均是用补码表示。例如:shortinta=-8,b;b=a»2;用二进制数表示的运算过程如下:a为-8在机内的二进制码:1111,1111,1111,1000用八进制表示: 177 7 7 7 0b=a»2后b在机内二进制码:1111,1111,1111.1110ハ进制表示: 177 7 7 6b的值为ー2.和左移相对应,右移时,若右端移出的部分不包含有效数字1,则每右移一位相当于移位对象除以2.“按位与”运算运算符&的作用是:把参加运算的两个运算数按对应的二进制位分别进行“与”运算,当两个相应的位都为1时,该位的结果为1;否则为0.例如,表达式12&10运算如下:12:0000,1100&10:0000,1010结果:0000,1000“按位异或”运算“按位异或”运算的规则是:把参加运算的两个运算数按对应的二进制位上,若数相同,则该位为〇:若数不同,这为1.例如:0011,0011A1100,0011结果1111,0000“按位或”运算规
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025河南信阳市潢川县妇女联合会招聘2名全日制公益性岗位备考题库及完整答案详解1套
- 糖网筛查中的患者个体化干预方案
- 2026中共虹口区委党校公开招聘专职教师备考题库含答案详解
- 2024福建省公务员考试备考题库(4543人)(含答案详解)
- 2025江苏南京白下人力资源开发服务有限公司招聘劳务派遣人员1人备考题库(五十一)及一套答案详解
- 2025云南玉溪若水建筑设计(集团)有限公司就业见习岗位招募14人备考题库完整答案详解
- 2025江苏南京古生物所非在编项目聘用人员(劳务派遣)招聘1人备考题库(2025年第18期)有完整答案详解
- 2025国家电投集团中国电力招聘26人备考题库完整答案详解
- 2025中国医学科学院北京协和医学院招聘26人备考题库及答案详解(夺冠系列)
- 2025河北唐山市滦州市公立二级医院自主招聘卫生专业技术人员30人备考题库及答案详解(夺冠系列)
- 2026年【招聘备考题库】黑龙江省生态环保集团有限公司面向社会公开招聘管理人员备考题库及1套完整答案详解
- 2026届山东省潍坊市高一生物第一学期期末监测模拟试题含解析
- 水库安全运行管理培训课件
- 2026年中国热带农业科学院橡胶研究所高层次人才引进备考题库有答案详解
- 高考英语读后续写技巧总结
- 2026年保安员资格证理论知识考试题库
- 2026年孝昌县供水有限公司公开招聘正式员工备考题库及一套完整答案详解
- 2025年下半年河南郑州市住房保障和房地产管理局招聘22名派遣制工作人员重点基础提升(共500题)附带答案详解
- 收费室课件教学课件
- 维修事故协议书
- 2025ESC+EAS血脂管理指南要点解读课件
评论
0/150
提交评论