



版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一.C语言的产生和发展1972年美国的DennisRitchie,最初用在UNIX下的DECPDP-11计算机。由早期的BCPL(BasicCombindProgrammingLanguage)发展而来,并命名为C语言。ANSIC提交给ISO后产生ISOC(内容基本一致):于1989年发布了第一个C的标准:C89最新一个是1999年的:C99GCC/CC是具体的C编译器二C语言的特点(原则):C是中级语言(它能对计算机硬件直接操作。当然说它是高级语言也对)C是结构式语言以函数〈注意跟数学的函数区分,它是大函数概念,形式(具体逻辑功能的载体,通过输入参数,进行内部黑箱操作,最后产生一个结果〈直接消化,或者返回给调用用户〉)来组织代码,通过循环,条件等控制语句使程序完成结构化C一定会有的函数:main()intmain(intargc,char*argv[])//Is-1-aMATH:Y=f(x,y,z)Y=x+y*z;C:intf(intx,inty,intz)(inttemp=x+y*z;returntemp;}intmain(){intY=f(3,4,5);}//unix/linuxmain是int返回类型,windows下main()是void返回类型。main。是整个程序的起点和入口C功能齐全,代码精简,效率髙效A+=32;==>A=A+32;//右边A发生了两次运算#include<stdio.h>»具体程序中没有用到的库函数,相关头文件没必要include.(包含)fabs()ぐ#include<math.h> gcc-ImC适用范围大##怎样去设计程序?.从问题实际出发,写ー个概括性的抽象的文字描述。る业务需求.定义变量,选定函数〈确定要包含哪些头文件》,确定程序实现的逻辑过程(算法)。〈思路〉(伪代码)る解决方案.按照以上两点,依据解决问题的顺序把语句和函数写出代码.る技术实现注意:不要边想边写代码:先把主干代码写出来,再慢慢加枝节代码(输出的格式更漂亮,容错措施,更细的ー些功能实现)る甚至把主干代码部分删了重写更具体的实现也是可以的.る代码不是一次写成的!る专业体现在细节!三.变量.变量是存储数值的内存空间,所存的值可被改变(储物柜:只能存固体物件,同一时间只能存一定的物体,但是不同时间可以换存别的同样的固体物体).由于数值的类型有多种,对应的变量就有:整型(整数)变量;浮点型(实数)变量,和字符型变量。本质上理解:C的数据类型只有:int整型变量,其它的数据类型可通过typedef类型重定义符得以实现拓展。(后边没有确定数据类型的变量或指针,默认的数据类型就是整型).有具体的存储方式:静态变量,外部变量,寄存器变量和自动存储变量(变量释放时系统会登记本空间已经空闲,但是空间所存值不会被清除)。.具体变量的标识名,一般不代表变量空间的首地址,而是代表变量空间所存的值。(字符串变量例外).变量的声明定义格式:存储方式数据类型变量名!,变量名2,…;注:函数体内变量的声明定义是合在ー起的变量的掌握要决:类型特性(类型拓展组合:〈形容性的关键字,unsigned,signed,long,short);字节长度;取值范围;存储原理;表现形态(包括初始化,常量形态,赋值等).整型变量(int):短整型(shortint)(-3万〜3万)(2字节),普通整型(int)(-21亿〜+21亿X4字节),〇可再细分有符号和没符号的整型。.浮点类型变量(double)〈表示的数值是模糊数〉用来存实数具体类型:float(4字节)单精度(7位有效数,6位小数)double(8字节)双精度(16有效数,15小数)longdouble。2字节)长双精度注意:并没有说明指数多少位本类型都是有符号的,浮点数主要应用在大数或超小数的存储上,它是类似人的ー种模糊记忆模式浮点数的存储原理:+0.314159*10"8*8=64位空间:最高位(最左侧)存符号(0代表正,1代表负),次高位8-11个位的空间存指数“2人n”里边的n,剩余的位空间用来存小数部分(314159)(整数只是0,忽略)//0000101011001000.字符型变量变量中所存放的字符是计算机字符集ASCH中的字符对应的序号。字符型变量可转变为整型变量,转换原理就是把对应字符的ASCII码序号作为整型值输出A〜Z:65〜90 a〜z:97〜122’〇'〜’9’:48〜57还能保存一些其它的控制符号:'n,\t,\b,\〇(0)sizeof(char)=!个字节•128-+127一般有符号signedcharszChar;〃也是可以unsignedcharuzChar;//也是OK因为原型就是整型〃〇〜25511111111=ド2A7+1*2A6+1*2A5+1*2ハ4+1*2ハ3+1*2ハ2+1*2Al+1*2人01*2人8-1=255char默认情况下是有符号类型三,常量是不可改变的变量:ー个没有传统变量的标识名(它用自身的内容值来代表自己),自动的,临时的,只读的,有类型的,存有值的内存空间例字符串常量。常数.整型常量,有长整,短整,有符号,无符号。短整:一3万〜+3万有二进制,八进制,十六进制011, 0x123011U0xl23U.浮点型常量,也有单精度F,双精度(默认的浮点数都是双精度),和长双精度L类型〃实际使用时比较少用字符后缀,而用3.0浮点数,3表示整数〃注意3.0和3在空间占用上是不同的有效位:单精度6位小数,7位有效值双精度15位小数,16位有效值格式化输出:%ffloat%lfdouble%llflongdouble.字符型常量用‘’单引号括上一个字符来表示一个字符常量,char字符变量空间占用永远是1个字节,字符常量事实上还是被解析成整型,所以空间占用是4字节。用へ加上具体数值或字符,,表示转义字符,例‘'0'(相当于,,,,空字符串),,也,(注意与“也,湘区分)前者常用来表示一个字符串结束了,后边常表示换行回车,、只是表示转义,不会占用空间另外也可以用整形数字(-128〜+127)作为char变量的值。5.字符串常量:字符串常量就是ー串字符(不限个数),用双引号括起来表示,它在空间上会多占用一个字节的空间,里边放上、。,表示字符串结束。字符串常量的空间占用是有效字符+1。可用strlen()去探测具体的字符串常量或变量有效字符长度。对于字符串常量可以用sizeof(字符串常量)去直接探测空间占用情况。注:strlen()是ー个函数,探测也可知道它没法加数据类型作参数。它的工作原理:由字符串空间首地址一直向后找'。标志,没有碰到持续找下去,直到碰到,即使变量空间越界也不管。一串字符也可以是中文,使用的字符集可能会有:3个字节:Utf-8国际共用,2个字节:gb2312简体中文,Big5繁体,GBK繁体较多,简体也能用!个字节:ASCII英文字母+法语,德语,俄罗斯语等西方的单字符内容5.地址常量(指针常量)变量在内存里的空间有对应的地址。我们可以用地址常量来引用这些地址:intiVal;&iVal&在这里表示取地址符,作用是取出变量(或者函数或者其它数据结构)的首地址。如何输出地址值:pintf(<<%p,,,&iVal);选做作业:把ー个字符串常量"ilovechina!“把它全部变成大写的方式输出“ILOVECHINA!”。ps:o基础的可以写伪代码。ぐ解决方案二.运算符单目,双目,三目单目:i++—i~i!i双目:即运算符位于两个表达式之间a+ba+3三目:1?printf(“true"):printf("false”).赋值运算符二(它不是数学上的简单的等式x=3+l/2*x,数学上x=6。但是C里intx=l;x=3+l/2*x;x=3)<注意区分赋值和初始化的异同,(初始化出现的情况:a.变量定义时给值,b.函数参数值传递)//inti=0;〃ぐ这是初始化(伴随定义过程中给值或者说变量刚分配好空间即给值)//i=3;//<・这就是赋值:将变量的旧有的值(不是垃圾值)清除,〈先了解,动态空间的指针变量还可能把旧的空间回收(C++里的对象的赋值),再分配ー个新的空间,再在这个新空间里给上新值.赋值语句:把某个常量或变量或表达式(包含有返回值的函数)的值赋值给另ー个变量。它表示“等于",而不是“是否相等”。它的符号是”二”,而不是“=="不同于数学上的:xA2+yA2=zA3x+3=5(左边表达式与右边表达式相等)
数学上的这些方程式可以这么表示:xA2+yA2==zA2x+3==5被赋值的变量我们称为左值,一般它出现在赋值语句的左边;产生值的常量,变量或表达式我们称为右值,一般它出现在赋值语句的右边。常量一般都只能作为右值。(函数返回值其实也是ー种常量,有返回值的函数也是ー个表达式,函数有函数运算符”〇”).算术运算符+单目正-单目负取反,有点类似!,-用在数学运算上注意:单目+,一都是作用在表达式结果值上面+-*/(除数不能为0) %(取余,除数不能为0)7%3=111%3=215%3=016%3=1取余应用:表达了一个有限范围值的概念。范围在〇〜(除数一1)之间。.逻辑运算符:真、假(因为真所以真,因为假所以假)&&逻辑与都成立为真I!逻辑或只要有真就是真!逻辑非将对象假的变真,真的变假(不会改变实际涉及变量的值,跟〜类似,不像自增自减)C语言没有BOOL类型,只有非。为真(别忘记负数),0为假逻辑短路现象.关系运算符:(关注:大小结果:真假〈整型1,0>)><>=<=!===在条件判断语句里,尽可能将类似if(a==32);这样的语句反过来写,写成if(32==a);以杜绝可能存在的隐患.自增自减运算符++a;-a;变量自身先加减1,后参与其它运算(一次运算)a-;a++;变量自身先参与其它运算,整个表达式运算结束后再变量自身加减1(两次运算)在复杂表达式里,对它的理解(a+++b-c)注意不要进行++a++;运算能这么做吗:++++++--++++ ++++++a;.复合赋值运算符+ニ加法赋值ー=*=/=%=«=»=&二1二八二普例:a+=2;==>a=a+2;完全等价?不是a+=2;+=只是进行ー次运算a=a+2;先进行a+2,结果存在临时空间(只读)里,后再把临时空间里的值取出来赋值给a.由此推向其它复合赋值运算,都是同理.条件运算符〈表达式1>?<表达式2>:v表达式3>先进行表达式1的运算或调用,如果逻辑上成立或为真,则执行表达式2的语句,否则执行表达式3.逗号运算符vv表达式1>,v表达式2>,v表达式3>,〈表达式4〉,〈表达式5>...>;Z=(a=O,—b,++c,d=3,printf(„Hi<<),while(a!=l)i++,e=5,f,++++-g);inta,b,c=9,d,e,f;〃不是所有用到逗号的语句都是逗号表达式多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个大的表达式的值是最后一个表达式的值来代表。逗号表达式运算优先级最低.位运算符(信号灯游戏)&位逻辑与两个操作位都为1オ是1I位逻辑或只要有一个为1就为1(包含了两个都为1也为1的情况)八位逻辑异或只要不同就为1(如果都相同,不管是不是1,都为0)<位逻辑异>〜取补(位取反),运算结果是作用在表达式结果值身上,而不是操作数自身(不是所有的单目运算符都会作用在操作数身上)«»左移右移跟乘除的关系左移n位等价于乘以2的n次方。右移n位等价于除以2的n次方。符号位是不会跟着移动,碰到最高位,会截断.运算符的优先级和结合性结合性:又称为计算顺序,它决定组成表达式的各个部分是否参与计算以及什么时候计算(大家优先级ー样时:自左向右运算,还是自右向左运算)优先级 运算符 结合性最高()〃Func(inta)数组Uー>.(连成一体) 自右向左| !~++-+-*(取内容)&sizeof(单目)自右向左I */% (双目) 自左向右I +• 自左向右I «» 自左向右I==!=>=<= 自左向右| &人|(双目) 自左向右| &&优先|| 自左向右| ?: 整体自右向左(内部自左向右)\/ =+=-=*=1=%=&=ハ=|=«=〉>=(变态双目,三目)自右向左最低,逗号 (多目)自左向右助记:目数越多,优先级越低结合性由目数升级,不断由自右向左,再自左向右不断切换特殊的:a+b*(c+d) 圆括号表示把所括内容当成一个表达式处理课堂作业:接收用户输入的任意值,并由用户指定目标数在二进制形态下需设置为0的位(二进制位第几位,),并将运算结果值输出。01110110第5位数的起点位是第0位11011111按位与 0010000000000001不能按位异(或)01010110三.表达式和语句表达式:它是由常量,变量,运算符组合(有返回值的函数也可以是组成表达式的元素)而成的语句,计算后会返回一个结果值。表达式可以嵌套使用,表达式内可以又有表达式,例逗号表达式。不是所有的语句都是表达式,是不是表达式要看有没有结果值.表达式返回的结果值是有类型的。表达式隐含的数据类型取决于组成表达式的变量和常量的类型,或函数返回值的类型。一般情况下,表达式内有多种类型时,以最复杂的那个类型为准,进行强制类型转换(两个结论)。每ー个表达式的返回值都具有逻辑特性:非。为真,〇为假。(C++オ有逻辑类型:bool)表达式结果值也是会有常量空间用来存储值.变量、常量,表达式,函数inta=l,b=a,c=a+b;//O整体是语句,局部是表达式inta=b,b=l,c=b+a;//X虽然b已有内存空间,但没有类型,不能准确称为变量,还不能拿出来使用.(后果:早产儿)V分配空间自右向左,初始化自左向右〉栈:后进先出想象一下ー个装大米饭的碗语句:一般以分号作为结束标志的都是语句,表达式是语句中的ー种特殊情况..标准输入语句(也是一种表达式,因有返回值)助记:用户的键盘输入和scanf函数的正式调用处理,是两个独立的过程.键盘输入时系统是把用户输入先存入到ー个输入缓冲区空间,最后看用户有没有输入ー个scanf格式化字符串参数中多出来的一个回车符(如果字符串中有\n,都不会马上进入第二个过程的处理)Scanf和printfー样,不会对参数做真实的类型转换,只会看%后边的类型说明符る%d情况下,用户输入字符,不会被转成整型数//scanformatintscanf(く格式化字符串》,〈可写变量地址表〉);int返回值表示返回函数实际接收到的正确参数的个数〃123a23.2a\nscanf具有输入缓冲区,未处理完的用户录入的数据,可供后面第二个scanf()使用空白字符く空格,回车〉,多个会被转成一个,起到分隔作用。注意:空格,回车在某些情况下又是在充当字符。非空白字符,像下面的格式化字串里的逗号,也可以起到分隔符的作用(要求用户输入的是字符串%s时,那逗号会被字符串参数吸收,容易引发大错误。怎样避免?不要加字符分隔符,scanf碰到空格,字符串输入会自动结束)inti;charc;floatf;scanf("%d,%c,%f',&i,&c,&f);//等价键盘录入:123,d,32.3scanf("%d%c%ド,〃没空白,也会等价于下面的语句scanf("%d%c%r,&i,&c,&f);//l3.88888\n空白字符,非空白字符及无字符在scanf格式字符串里都是来用起所输入参数分隔作用,格式要求的作用格式转义符号作用
%d%hd%ld十进制有付号整数int,short,long%u%hu十进制无符号整数,无符号短整型单精度浮点数/双精度/长双精度%s字符串(录入的字符串有空格,scanf就会停止继续给值字符串参数,可用fgets()...)%c单个字符%p指针的值,地址值(更多用在printり%x十六进制数%oハ进制数加上-表示左对齐,默认是右对齐printf。、scanf()下的格式用法:%5d-I2—12%-5d”1212―%()5d—1200012%8.3f“12.0 12,000注:-,前缀〇在scanf里基本没作用〇当在格式说明符之间加入・时,表示忽略scanf(”%・网n[%*c");〃忽略用户输入的一切直到碰到换行符(回车),再忽略换行符用户录入缓冲区:"adsfk叫weruvswr'n"%*[A\n]=>“\n”%*c,“'上面语句的作用是清空用户录入缓冲区的数据,当缓冲区有不单有至少ー个普通字符,在后面还有\n,可用scanf(,,%*[A\n]%*c,,)iscanf后边推荐加上:while(getchar()!=,\n,);可准确的清空缓冲区(一定要有一个W)scanf()要求有一个回车符作为scanf调用返回标志(不是用户每次录入回车scanf都会返回,有可能被字符型参数吸收),但是回车符并不会给scanf清除吸收(回车符在特定条件下也会被吸收,如刚好对应%じ或%s,如果没有被吸收,就是起分隔或触发调用返回的作用).如果scanf在ー个循环体里,a)ー开始它就得不到正确的参数,则会死循环:while(l)scanf(,,%d,,,&iV);//b)用户如果直接回车scanf不一定会返回,0参数对于非字符参数没有意义.还是会等待用户输入至少ー个非回车/非空格字符.fflush(stdin);〃无条件的强制清除一切输入缓冲区,局限性:相当于拿掉缓冲区,只能在VC下这么用。fflush(stdout);〃强制输出缓冲区的内容。在UC,VC下都有作用。.标准输出语句intprintf(く格式化字符串>,〈参数表〈表达式》);int返回值表示所输出的字符串字节长度(GB2312,BIG5,GBK中文占2个字节,UTF8:中文占3个字节,英文及符号占用1个)一切函数的形参的调用顺序是自右向左(还是栈的概念,后进先出,右进先出)符号作用〃12:30:35\r置同行最左,后面紧随文字采覆盖方式\xhh表示acsii码用16进值表示.条件语句if(表达式){语句1;语句2;}if(表达式)语句1;elseif(表达式2)语句2;else语句3;if(表达式1)〃条件是有权重层次的,进阶关系(if(表达式2)…elseif(…)...else...;〃只有条件1成立オ可能进行条件2之类的判断)elseif(…)…;〃可以是平行if(.if(.}〃推荐这么用###以下方式不推荐同学们使用,会让程序层次可读性变得特别差if(表达式1)if(表达式2)语句1;else语句2;〃近水楼台先得月这个语句与表达式2的if语句相配套else语句3;switch(整型变量或整型常量或整型表达式)〃a(case1:语句1;...;语句n;break;〃默认多个语句可以不加花括号case2:inta=0;语mJ;break;case3:{inta=l;语句break;}〃什么情况要用花括号〈作用域〉,不要干扰到其它条件的处理代码Z/b语句1;...;语句n;break;default:语句!;...;语句n;)//case1:case2:这些本质上还是ー个标号花括号:1.可组合多个语句。把各个小语句组合成大的ー个语句,也称为复合语句,但不是表达式。.限制花括号内的语句的作用域(影响区域)。.花括号内外如果有同名的变量定义时,内部的会屏蔽外部的同名变量.循环语句和循环控制JumpHere:for(〈起始值设定表达表或语句〉;〈条件表达式或语句〉;〈增量表达式或语句〉)//;这里不加;〈起始值设定,不是〈初始化〉:C这里不能加int之类的定义表达式JumpHere2:for(く初始化〉;;〈增量,)(for(;;)/・无条件循环・/{if(l)break;gotoJumpHere;}if(l)continue;〃本循环紧跟的代码不会被执行,而是直接进入下ー轮的循环if(0)break;}if(l)break;}JumpHere3:跳出范围:continuev跳出本次循环〉v=breakく跳出ー个循环〉v=gotov可跳出多个循环〉.while(条件表达式)语句;if(l)break;do〃不管条件表达式成不成立,都先执行一次,再判断要不要再次循环(语句;)while(条件表达式);〃这里要加;作业1:求两个整数的最大公约数。(最高效的算法)〃8,4最大公约数是4作业2:判断ー个整数是不是素数。〃只能被1和本身整除的数是素数做项目的两大原则:专业体现在细节。要注意出错细节的处理!用户是个顽皮的小屁孩!代码要健壮,要能容错!四・数组是ー组同类型的变量的集合体,在内存里连续存储分配。1.数组声明(声明不一定是定义,主要用来预告变量等相关的类型定义信息、,在代码上后出现的对象的定义如何提前被前面的代码去调用就是依靠声明,声明没有初始化过程,在ー个程序里,声明可以重复出现多次,有时声明和定义格式上是ー样)和初始化2,如何访问数组元素a.用下标运算符口去访问内容(有些情况还能访问数组的地址)b.也可以用类似指针(有数据类型的内存地址)(结合・取内容符号的访问方式)的方式去访问数组元素.字符数组:ー个字符数组不一定是一个字符串字符串:ー序列连续排列的字符组合,并以、0为结束标识。字符组合不一定是字符串。输出字符数组时要特别小心,如果不能明确里边的内容是不是字符串,最好不要用printf的%s去直接输出数组。可用(FOR(i=0;i<sizeof(ary);i++)printf("%c”,ary[i]);)去打印字符数组。一般只能存一个字符串,虽然多个也可以存,但是输出时只能以字符为单位输入,即上述for..printf方式。作业:得到用户输入的任意英文字符串,把它小写的全部变成大小,并且倒序输出<ー不要出现缓冲区有多余内容,并且含有空格也要能处理,要标准getchar():一次获取用户输入的ー个字符(包括空格或回车等等)vwhile.getchar组合与scanf配套使用时才能精准表示清除缓冲区的用义,其它地方有可能变成是循环等待用户输入,因为缓冲区有可能为空>strlen();获取字符串的有效长度(不含、0),如果要用它表小字符串实际在内存中的占用情况,需:charstrU="abc";intiStrLen=strlen(str)+1;对ー个字符串的访问,其实是在访问它的首地址.多维数组多维数组不是用来存多种不同用意的数据,而是用来有条理的管理多个同类型的数据重点把握:a.层次关系的把握,b.地址运算的规律.字符串数组(特殊二维字符数组,要求每ー个行存ー个字符串,末尾要加、。)〈尽管字符数组也可以在里边保存多个的字符串,但是毕竟是ー种特殊的情况,我们所说的字符串数组,是指非常方便的用于存储多个的字符串的这么ー种用意〉用来处理多个字符串的二维数组。每一行空间里至少会有一个。.putchar(putc)/puts/(fgets)/strcpy(stmcpy)/strcmp/strlen(只能用于字符,字符串操作)char*strstr(constchar*bigstr,constchar*substr)〃在ー个bigstr字符串里查找ー个substr小字符串,比较时不包含、。,如果找到就返回所找到的字符组合的首地址,否则返回NULLmemset内存赋值或清空memcpy内存拷贝(不限数据类型)作业(小项目):实现ー个查找指定子字符串find_str的函数,如果找到子字符串则将目标字符串中的子字符串替换成指定的另外一个字符串desjstr,例如:abcdefg中找def,找到后替换成DEF,最后整个字符串就变成了:abcDEFg.如果没有找到指定的子字符串,则返回一1值,否则返回一个在字符串obj_str中的所找到的首字符对应的下标值intstrReplace(charobj_str[],charfind_str[],chardesc_str[])//charstr[50]=^^abcdefg^^;//intpos二strReplace(str,"def',"DEFFFFFA");〃基本要求:实现等长替换〃进阶要求:实现不等长的替换(内存操作函数)〃不需理会obj_str的空间是否够用的情况。五.函数具体逻辑功能(与数据〈局部静态变量〉)的载体,通过输入参数,进行内部黑箱操作,最后产生一个结果〈直接消化,或者返回值(可能一个数据,也可能是ー批数据。可能通过return(可以返回普通变量,指针或结构变量〈ー批不同类型的数据》),也可能通过形参的间接方式〈如形参是指向内存的ー个首地址,一般是数组〉)给调用用户,.函数声明和调用声明:是对编译器宣告有这么ー个函数,它的返回值及形参变量的类型是怎样的,函数名是什么,即使函数体编译器还没有见到,它也可以先对调用这样的函数的语句编译放行。隐式声明:如果ー个函数被调用前连声明都没有,C编译器也能放行,不过返回值类型就只能是int类型。(C++不再支持隐式声明)函数调用:运行使用指定函数名的函数,一般伴随参数的传递和返回值的接收过程(不是必需)。(主调函数就是用来调用其他函数的。被调函数是被运行调用的函数)(调用函数后它的返回值的接收不是必需的,即使没有接收也没有关系,这个返回值会存在临时空间里,所以也可以把有返回值的函数看作是ー个对应返回值类型的常量,返回的所指向的空间如果不是只读(间接),结合一些运算符,如・,构成一个表达式还能充当左值:*func()=123;)C语言中函数名在程序中一般必须是唯一的。也必须遵守标识符命名规则。(C静态函数,被不同的文件包含时,有时
也可以允当不同的函数,因为作用域不同。C++函数重载:允许多个的函数名相同,但要求形参类型或排列顺序不同)V函数名,变量名,数组名,指针名都没有自己的标识符存放空间,包括后边C++的引用名也ー样,它们都只是给人看的,编译器不需要这些,正如计算机只看二进制,不看十进制ー样〉UNIX一切函数都能调用自己,函数名代表了函数的首地址。(递归调用)函数的格式:声明:返回值类型函数名(形参列表〈形参类型1,形参类型2…〉);〃可以没有形参变量名。声明作用只是告诉系统可以怎样去调用这个函数声明是给计算机看,它只需了解待调用函数的具体类型,而不需要标识符。只有参数类型,没有形参变量名的称为哑元,它只提供类型信息,眼前不需要使用,常用于声明或提供区别及兼容作用。
函数的定义实现一般必须要有形参变量名,没有的话就无法得到主调函数传来过来的实参副本数据。void:没有返回值,可以放在返回值的地方,也可以放在函数形参列表处;void*未确定实际数据类型的指针变量,它不经类型转换要做地址运算,就是放大(缩小)1个字节(内存空间基本单位就是1个字节)。定义实现:返回值类型函数名(形参列表〈形参类型变量1,形参类型变量2…>){ー个或多个语句;}.函数参数的传递和值返回函数的形参列表内的变量调用顺序自右向左,形参变量列表的空间分配是自左向右(跟函数体内的多个变量的空间分配及初始化顺序是相反的)。函数实参向形参的传递和返回值本质上是值的拷贝(即使实参变量名与形参变量名ー样,也不是同一个变量),各个实参类型(如果能类型转换也可以,不是所有类型都能相互转换unsigned和float)和排列顺序必须与函数定义的形参列表一致。拷贝目标是实参,拷贝的目的地是形参变量。形参变量得到的值其实是ー个实参变量值的副本,是ー个克隆体(存值的空间不同)。变量在函数体中是自下向上,自右向左分配空间。变量在函数体中的定义及初始向是自左向右。与形参的两种顺序刚好相反。当函数定义没有返回值类型,甚至连void也没有,这时C语言会默认处理为返回血类型(C++没有返回值的一般是特殊函数,如构造函数和析构函数),例:func();^intfunc();C不像C++,可以完全没有返回值类型(void其实也是ー种类型).可变参数的函数实现类似printf(),scanf()这样的函数,里边的参数个数是不定(限制条件:至少要有一个确定的参数〈指定数据类型的参数,在形参列表里靠左放置,)。%d%s%c%f〃告诉可变参数类型是什么:1每一个可变参数类型2.整体到底有多少个可变参数一般参数列表是确定的,定义时有多少个形参,调用时就必须提供多少个实参,顺序要一样,指定实参与形参对应的数据类型也要一致(可强制转换类型也可以)。实现可变参数函数,需要用到ー个类库,头文件是stdarg.hvajist结构类型〃可用来定义ー个存储指向可变实参列表的结构变量va_start,va_arg,va_end二个宏va_start:告诉VA类库到底可变参数是由哪ー个固定参数之后オ开始(后边都是可变参数,va_start是用来定位可变参数的开始位置)。va_arg:获取当前的可变参数结构变量里的ー个实参值,并且结构变量内部的位置指针向后自动推进一位(下一次再调用va_arg,得到的就是下ー个参数值)。va_end:结束操作,释放资源…:是ー个可变参数运算符,表示可接收不定参数(〇〜无限个)六.变量的作用域和存储类型1.C的标识符作用域就三种:局部(不单指函数,还包括内部的像循环体等{}内的作用域)全局(一般指放在函数外边的ー些变量):在多个互不include的文件中都有作用,不过这个作用要靠extern声明去揭示文件〈没有被include的文件オ是不同的文件,:作用域只限文件自身内部。作用域:它决定了程序中的哪些语句可以使用该变量,或函数,结构体等等对象2,各种同名变量作用域的优先顺序:下层花括号语句体〉〉上层函数体〉〉全局/文件(优先级高的屏蔽低的同名变量)2.2生命期:全局〉=文件〉二函数〉=下层花括号语句体3.变量的存储类型(生命期,作用域)自动(auto)〈生命结束时,有系统善后,自动由系统回收内存空间资源,原理:只是登记这片内存空间已是空闲状态,并没有去清除空间所存的内容值。编译器默认变量就是auto类型〉。静态(static)く生命期如本进程一样长,静态不是只读的意思,表达了一个生命如进程的概念,如果它放在函数外边,变量加了static就是在限定变量的作用域为本文件的代码中会有作用。另外如果static加在函数的局部变量里,则它的作用域就只限在该函数内部〉,外部(extern)〈生命如进程,作用域是全局的,不限具体哪ー个文件,但是引用这个变量的文件需要声明有这个全局变量,就是用extern声明当前这个全局变量是由外部文件的全局区域定义的这么个全局变量〉,寄存器(register)〈除了程序无法得到其内存地址外,其余和自动变量ー样〉有递交申请为VIP身份这样的含义〈不一定能申请成功,不成功则作为普通变量,选做作业:使用可变参数技术,实现各个可变参数成员的值的累加效果,最后把等式显示出来,并打印累加的结果值const表示只读,加了这个关键字,变量的空间就只能读不能写,那唯一的一次写的机会是在变量的初始化时volatile易变的(实时更新的),不需要进行优化处理,有变化,不要保留,马上反应七.递归函数递归的意思是函数自己调用自身(直接方式),或者在自己函数调用的下级函数中又调用自己(间接方式)。//F(){F();}//F(){F();F();}//F(){E();} E(){F();}〃可读性差,变态的,递归:可拆分为递(向下层传递参数)和归(函数不再向下传递时会ー层ー层的返回)两个过程〈类似ー个人在大厦里爬楼梯,爬到顶层了没事可干,再ー层ー层爬回地面(注意层次不要搞混)〉递归与循环的异同,请参考示图。写递归函数需考虑的要素:a,怎样取ー个变量或多个往下递归(不是绝对,但是推荐这么做,变量在传递中要有变化)b.怎样终止递归,要设置一个合理的终止条件(原来的规律不能成立,函数递归层的代码不再重复)c.递归过程中的临时或中间结果怎样保存(例:递归函数的静态局部变量,或用ー个变量参数将它再传下去,变量可以变得更高效和精简),不是每一个递归都需考虑这个情况。注:递归函数没有限制函数体里可以调用多少次自身,但是物理硬件决定了他还是会有一个极限,尽量不要超过26万次(UNIX)在ー个递归函数体内部可有多种的递归调用副本,每ー个副本传递的参数不同。例:func(n){if(n<l)return;func(n-l);func(n-2);func(n-3);return;}递归思维(怎样用递归解决有规律可循的一些问题)A.找到ー个有规律可寻的问题的解决方案的ー个典型的环节(层面),只考虑这ー个层面的代码应该如何实现(由点到面,这个点是有普遍代表性的)B.在这一个层面里只考虑a.参数变量如何设置,如何变化传递。b.终止条件语句如何写,也就是不再遵守典型规律的那些情况如何变成代码上的终止条件。c.仔细调整一下需输出文字信息放在递的过程和归的过程的情况,不要出现重复打印的情况结论:递归思维本质特点是暂时忽略各个层次实现的不同细节,而只关注固定的某ー环节的较大过程实现即可(有规律性的.例外情况不会太多的问题,适合用递归来实现)作业:实现汉诺塔的功能,将由小环到大环堆放的多个环(大环上边可放小环,小环下边不能放比它小的环)从ー个位置搬到另ー个位置的算法,另外只提供ー个缓冲位置(整体就三个位置空间)。把搬运具体环(第几环)的过程打印出来(文字清单输出举例:将第几个环由哪ー个位置搬到哪ー个位置。将第几个环由哪ー个位置搬到哪ー个位置。。。),第N环比第N—1环要大intmain(intargc,char*argv[])八.预处理预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。(预处理不是真正的程序:预处理处理的是文本,产生的结果仍然是文本)预处理指令是以#号开头的代码行,结束不需要加;号。指令用途#空指令无任何效果,类似空行#include包含一个源代码文件#define定义宏#undef取消已定义的宏〈后边方便可以再次使用同名的宏标识符再去替代其它的内容,#if如果条件为真,就编译下面代码(一般跟常量或宏)#else跟#if等条件判断预处理指令配套使用,相当于程序里的else类似作用。上面条件都不成立,则编译下面的代码#ifdef如果宏已定义,则编译下面代码〈不关心宏有没有值,或值是真还是假,只要有定义这么ー个宏,ifdef就认为是真,#ifndef 如果宏未定义,则编译下面代码#elif 如果前面的#if条件为假,当前条件为真,则编译下面代码(一般跟常量或宏)velseif>#endif 结束ー个#if..#else条件编译块或#ifndef#ifdef#endif存在这ー个预处理命令是因为预处理不支持{}预处理符号#error 停止编译并显示错误信息#line 可以将#line下文代码重编行号#运算符 称为字符串转换运算符(要用在预处理语句里):##运算符 (用在预处理行语句)程序调试需要用到的宏指令(系统预定义好的宏)_LINE_#line指令可以改变它的值,简单说,编译时,它包含程序的当行行数_FILE_ 指代代码所在的文件名_FUNCTION_指代当前正在运行的函数_DATE_ 宏指令表示源文件被翻译到正式代码时的日期(字符串)_TIME_ 程序编译的时间(字符串)_STDC_ 如果_STDC_已经定义,如果编译器是用GCC编译代码,这个宏会为1,如果是用G++或其它编译,它不为lo_CPLUSPLUS_与标准C++一致的,编译器把它定义为ー个包含致少6位的数值。与标准C++不一致,编译器将使用具有5位或更少的数值。九.指针(掌握的重点:首地址,因子,层次,不能代表所指向空间的整体占用,ロ/*/&)指针概念1.指针基本概念及其指针变量的定义(指针变量简称为指针)指针是这样ー个特殊的数据类型,这个指针变量用来存放其它变量的地址,同时还点明了所指向变量的数据类型(让因子VI字节单位的倍数〉有着落〈void・类型因子是1个字节VI倍〉,内存空间最小单位〉)〇(a.首地址:获悉怎样去操作指定的变量空间b.数据类型〈因子〉:获悉地址运算能怎样进行)〃0xl24ffleく这是ー个16进制的整型常量还是ー个地址常量???表面看不出〃inta,&avー这就是地址常量〈一地址常量可看成是一个指针常量//这里有点明数据类型ー个指针变量在内存中占用4个字节。(指针变量的自身内容空间不是指指针是int类型,而是刚好它也占用4个字节,指针的类型(为何指针要有数据类型:要确定因子)取决于定义时给定的数据类型)char*a;sizeof(a)==?4//a指针变量的自身的内存空间有多少char*a=^^abc^^sizeof(*a)=?l〃指针所指向的空间大小(因子),不是取决于空间的内容,而是指定定义时的数据类型(char)不管指针所指向的是什么数据类型,他自身的空间占用就是4个字节类型标识符*指针变量1,普通变量1,・指针变量2,普通变量2; 〃・在这里表示定义指针,修饰只起一次作用・在其它语句表示取空间的内容值,获取变量所在空间。如果这个空间不是只读的,还可以直接作为左值左值概念本质:可被改写的空间才能充当左值void*p;〃未确定数据类型的指针,一般没有办法直接用,使用前最好做强制类型转换,一般出现在函数形参或返回值〈泛型编程的思路。代码的复用性增强,。要用时需将它转换为有具体数据类型其它指针。Char*p=(char*)malloc(l);//malloc返回了一个已分配好的ー个字节的空间,这个空间类型未定,所以返回的指针类型是void・我们这里是强制给他转换成char类型。C中规定,当指针值为0(NULL)时,指针不指向任何有效数据,这时可称为空指针。有时也常用NULL来指示函数调用中某些错误情况的发生。指针变量定义,一直到被调用过程中都没有给它赋过值。这样的指针可称为野指针,他的值是垃圾值。但有时垃圾值对应内存地址还是有内容。这样直接去使用非常容易出严重问题,所以要避免野指针的情况出来。不指向具体变量地址时,给他赋上NULL不要
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国数控机市场分析及竞争策略研究报告001
- 诚信文案与情绪管理
- 蛛网膜下腔出血护理过程
- 老年人护理安全
- 骨科手术疗效与康复计划总结
- 跨部门协作的年度计划
- 通信企业安全管理
- 药企记录填写规范
- 水质量安全风险预警机制计划
- 学校美术课程改革探索计划
- 学生心理健康一生一策档案表
- 2025年湖南省长沙市初中学业水平考试模拟(一)历史试题(原卷版+解析版)
- 2025年上半年绵竹市九绵产业投资限公司招聘易考易错模拟试题(共500题)试卷后附参考答案
- 幼儿园获奖公开课:小班科学活动《谁的脚印》课件
- 2025年中考道德与法治全真模拟卷1(含答案解析)
- 浙江省温州市2024年九年级学生学科素养检测中考一模数学试卷(含答案)
- 人教版新教材英语七年级下册Unit5课文原文翻译
- 湖南省2024年普通高中学业水平选择性考试物理试题含答案
- 江苏南通历年中考语文古诗欣赏试题汇编(2003-2024)
- 2025年河南省高职单招《英语》高频必练考试题库400题(含答案)
- 土方工程投标方案(技术标)
评论
0/150
提交评论