2022年C语言知识点分章总结.docx
C 语言程序与设计学问点20XX 年 12 月 07 日第 5 章 数据类型与输入输出1. 标识符:( 1)只能由字母、 数字和下划线构成; ( 2)第一个字符必需是字母或者下划线;( 3)长度只有 31 个字符有效; ( 4)不能包含空格; ( 5)不能使用关键字;2. 变量三个要素为:类型、名字和值;同一语句中不能混合定义不同类型的变量;3. 常量:直接常量和符号常量4. 十进制常量: + | - Digits l | L 5. 八进制常量: OctalDigits L | l 6. 十六进制常量: 0x | 0X HexDigits L | l 7. 补码: 负整型数在内存中的存放形式;将该数的肯定值的二进制形式,按位取反再加 1;8.浮点数: -2.34, 3.1416f, 29.00, .23, 0.23L, 1.23E10, 0.23E-4, 45.e+23, -23.68E129.输出操作 :调用库函数 printf 时用“ %f”格式输出10.错误: float f1, f2, f3; printf"f1 = %d, f2 = %d, f3 = %dn", f1, f2,f3;11. 浮点数,默认输出小数点后6 位数字12. 输入操作:调用库函数scanf 时用“ %f”和“ %lf”分别对 foat 型和 double 型数据进行输入;13. 输出操作: 调用库函数 printf 时用“ %f”对 foat 型和 double 型数据进行输出 ; % lf 为 long double 类型输出; %e 或 E按科学计数法的形式输出;14. 应防止将一个很大的数和一个很小的数直接相加减,否就就会丢失小的数15. 字符常量:用单引号括起,只能是单个字符,仍包括转义字符,一种特别的字符常量, 以反斜线 "" 开头,后跟一个或几个字符;16. 字符型数据和整型数据之间可以通用,表示方式和操作与整数相同,但要留意范畴;17. 整数的格式化输出: %对齐方式 输出最小宽度 整数类型18. 整数类型的输出:%d 、%o、 %x/%X 或%ld19. 实数的格式化输出: %输出最小宽度 .精度 实数类型;一般默认数据右对齐,如输出宽度前加负号,就设置为左对齐;20. scanf 格式输入函数,留意三种输入函数的输入方式区分:scanf "%d%c%f ", &i,&c , &f ; scanf “ %d,%c ,%f ”, &i ,&c , &f ; scanf” i=%d b=%c c=%f” , &i,&c,&f;21. scanf 中要求给出变量地址,如在格式掌握字符串后直接给出变量名,就会在运行时出错;22. float 类型的数据可以用 %f 进行输入或输入操作;对于double 型的实数,必需用%lf 的格式输入数据;23. 编译器在遇到分隔符或非法数据时即认为输入操作终止;24. 格式字符可以用空格分隔,但最好不用回车作为分隔符,除非后面仍有数据要输入;25. 留意在循环函数中使用scanf中,用 %c输入字符型数据时的特别性;第6 章 运算符与表达式1.表达式是由运算符和运算数组成的式子2.表达式依据某些商定、求值次序、结合、优先级规章来进行运算.3.求值次序:表达式中各操作数的求值次序视编译器不同不同;4.“ /”操作符对与不同的数据类型进行不同的操作5. 只能对整型数进行操作,不答应对浮点数操作6. 字符类型的数据象整型数据一样,可以进行相关运算;7. 变量赋值与初始化的运算机操作不同;8. 左值:常量和算术表达式不能为左值.9. 右值:左值表达式可以作为右值表达式;10. 牢记运算符的“优先级”和“结合性”11. 隐式转换:( 1)“就高不就低”的原就; ( 2)当赋值运算的左值表达值与右值表达式类型不同时,将右值转换成左值的类型;( 3)数据可能丢失精度;12. 显式类型转换:强制转换运算符(类型名(表达式),(类型名)变量13. 自增 i+:先使用变量, 然后对变量增值; 自左向右将运算符结合, 如 a+b 等同 a+b;14. 自增 +i:先对变量增值,再使用变量;从右至左结合,如+b 等同+b;15. i+和+i 在单独使用等效;16. 自增操作不能为常量或算术表达式17.int i=1, b; b=i+ + i+ + i+,问 b=.; printf “%d”, i+ + i+ + i+;输出是什么?18.+i+ +i+ +i 编译器不同,结果不同;19. 留意关系表达式 a <= x < b 产生的误会;正确选项a <= x && x < b20. 在规律表达式的求解中, 并不是全部的规律运算符都被执行,只是在必需执行下一个逻 辑运算符才能求出表达式的解时,才执行该运算符;1 a && b && c只有 a 为真 非 0 时,才需要判别 b 的值,只有 a 和 b 都为真的情形下才需要判别c 的值;只要 a 为假, 就不必判别 b 和 c此时整个表达式已确定为假;假如 a为真,b 为假,不判别 c;2 a|b|c只要 a 为真 非 0,就不必判定b 和 c;只有 a 为假,才判别 b;a 和 b 都为假才判别 c;21. 规律运算符的优先级:. 高于 &&高于 |22. 逗号运算符: 将各表达式从左到右的次序依次求值,最右端的表达式的结果作为整个表达式的值; int a=1, b=2, c=3; int sum = a+b, b+c , c+a ; /sum=4; sum = a+b, b+c, c+a ;/sum=3 ,表达式值为4第 7 章 挑选结构1. 判定的表达式通常为关系或规律表达式,也可以是具有规律值的其他类型表达式;2. 赋值表达式也可以作为判定表达式;不能混淆赋“=”和 “ =”;3. 判定的表达式:其值等于0 为假,非 0 为真;4. if 语句难点:设计判定条件;在实现挑选结构时,常常由于判定条件构造不合理造成规律错误 .5. if 与 else 的配对关系: else 总是与它上面最近的、且未配对的if 配对;6. switch 语句:判定表达式括号应具有整型值,一般为整型、字符型或枚举类型的变量或者表达式;7. case 后面的标号为常量表达式,其值必需是整型、字符型或枚举常量;8. switch 语句中每个分支须保证唯独性,即case 后的标号值必需互异;9. switch 语句假如期望在执行完相应分支的语句后跳出swich 结构,必需使用在各个分支中使用 break 语句;10. 留意在循环语句中使用switch 语句时,分支的语句后跳出switch 结构,各个分支中使用 break 和 continue 有区分;第 8 章 循环结构1. 设计循环结构要点: 需要重复哪些的步骤, 即循环体中的操作; 需要合理设计循环条件, 使循环不无限次执行;修改循环条件,使循环条件的值趋近0;2. 设计循环结构要点: ( 1)循环条件?( 2)循环终止条件 .(3)如何修改循环条件 .3. 循环结构两种基本类型:当型循环;直到型循环;4. do 循环体 while 表达式 ; 不要遗忘 ”;”5. for 循环变量赋值 ; 循环条件 ; 修改循环变量 循环体语句 ;6. for 表达式 1; 表达式 2; 表达式 3 循环体语句 ;(1) 求解表达式 1;(2) 求解表达式 2;(3) 如其值为规律真,就执行循环体中的语句;如其值为假就终止循环,转到第(6)步;(4) 求解表达式 3;(5) 重复执行步骤(2)、( 3)、(4)中的操作;(6) 循环终止,执行for 语句后的语句;7. for 语句分号不能省8. 用 while 和 do-while 循环时, 循环变量初始化在while 和 do-while 语句之前, for 语句可以在表达式 1 中实现循环变量的初始化;9. while 和 do-while 循环, 循环体中应包括使循环趋于终止的语句;for 语句可以在表达式3 中实现;10. for 语句和 while 语句一般用来实现当型循环,循环体可能一次也不执行;do-while 语句构成的直到型循环,循环体至少执行一次;11. 各种循环语句都可以相互嵌套, 内层和外层循环掌握变量不应同名;循环嵌套不能交叉, 即在一个循环体内必需完整的包含着另一个循环;12. 循环中的跳转: ( 1) break 语句;( 2) contiune 语句;( 3) goto 语句;第 9 章 数组1. 数组:肯定数目的同类元素,次序排列2. 一维数组定义:类型标识符 常量表达式 ;3. 数组三要素:类型、数组名、元素个数4. 数组名是第一个元素的地址,为不能更换的常量;5. 方括号中常量表达式表示数组元素的个数,数组大小为整型常量表达式, 不能为变量;6. 数组必需在给定长度后,才能使用(即赋值);7. 数组总字节数 =sizeof类型 * 数组长度8. 下标方式拜访数组ai;9. 指针方式拜访一维数组*a+i;10. 方括号中的位置号通常称为下标/ 索引,为整数或整型表达式,表示该元素与首地址的偏移值;11. 引用数组下标越界时,运行时并不报错;数组越界拜访可能造成严峻错误;12. 不能一次引用整个数组, 只能单个使用每个数组元素, 使用循环语句遍历数组各个元素;13. 数组元素和同类型变量操作14. 不能直接把整个数组赋值到另一个数组15. 不能用一个语句给整个数组赋值16. 一维数组初始化,4 种可以: int a 5 = 1,3,5,7,9 ; int b1 5 = 0 ;int b2 5 = 1, 2, 3 ;int c = 1, 2, 3, 4, 5, 6 ;17. 一维数组初始化,3 种不行以: int d 5 = 1, 2, 3, 4, 5, 6, 7 ; int a 5 = 1, 3, 7, 9;int b 5 = ;18. 记住冒泡排序法19. 二维数组:用双下标表示某个元素的数组称为两维数组20. 二维数组定义形式:类型说明符数组名 常量表达式 1 常量表达式 2;21. 二维数组的储备结构:线性储备22.按行分段赋初值:int i23 = 1, 2, 3 , 4, 5, 6 ;23.按行连续赋初值:int j23 = 1, 2, 3, 4, 5, 6;24. 二维数组初始化,2 种可以:int k 3 = 1, 2, 3, 4, 5, 6, 7, 8, 9 ;int n 4 = 1, 1, 1 ; /仅对第 0 列元素赋初值25. 二维数组初始化,1 种可以:int m3 = 1, 2, 3, 4, 5, 6; /错,不能省略其次维长度第 10 章 函数1. C程序可以由多个文件组成,文件负责组织存放如干个函数;2. 源程序文件为C 程序的编译单位,每个文件单独编译,便于调试;3. main 函数是程序执行的入口4. main 函数可以调用其他函数,其他函数调用终止后,仍要返回main 函数; main 函数执行完毕,整个程序就终止了;5. main 函数可以显现在任何位置,但每个程序有且仅有一个main 函数;6. C程序的全部函数都是平行定义的,在一个函数内部不答应定义另外的函数;7. 函数可以相互调用,但是不能调用main 函数;8. 形式参数表:类型1 形参变量 1, , 类型 n 形参变量 n9. 函数名:函数的入口地址10. 实际参数表:与形式参数在个数、类型、位置对应11. 实际参数表:参数可取常量、变量或表达式;12. 形式参数表:不能为常量,常量表达式;13. 函数调用中求值次序的问题:对实参表中各量是自左至右仍是自右至左使用未作规定;14. 函数遵循先定义后使用的原就;如被调用函数在主调函数之前定义,需在被调函数调用之前进行声明;15. 函数声明的作用: 编译器依据函数原型检查函数调用的正确性;函数的名字; 函数返回的数据类型;函数要接受的参数个数、类型和参数的次序;16. 函数声明的一般形式:类型说明符被调函数名 类型 形参, 类型 形参 ; 或 类型说明符 被调函数名 类型, 类型 ;17. 实参可以是常量、变量或表达式,在调用时将实参的值赋给形参;18. 实参加形参的类型应相同或赋值兼容;19. 形参变量只有在被调用时才安排内存单元,在调用终止时,即刻释放所安排的内存单元;形参只有在函数内部有效; 函数调用终止返回主调函数后就不能再使用该形参变量;20. 实参向形参的数据传递是单向“值传递”;只能把实参的值传送给形参,不能把形参的值反向地传送给实参;在函数调用过程中形参的值发生转变,实参的值不会变化;21. 函数的值只能通过return 语句返回主调函数;不能返回数组;22. 凡不加类型说明的函数,自动按整型处理;(新 C+环境下不行以)23. 留意函数传值(实参至形参,return )类型不一样的时候,遵循类型自动转换原就;24. 数组元素作为函数参数-按值传递25. 数组名作为函数参数 -按地址传递26. 通常为了能够让函数处理不同长度的数组,函数的参数表应指定接收数组名及数组大小;一维形参数组可以省略维数,但是不能省略 27. 多维数组也可以作为函数的参数;形参数组可以指定每一维的长度,也可省去第一维的长度;28. 递归需要有( 1)递归终止条件,和(2)简化过程;29. 递归采纳重复调用机制, 重复函数调用的开销很大, 将占用很长的处理器时间和大量的内存空间;每次递归调用都要生成函数的另一个副本 实际上只是函数变量的另一个副本从而消耗大量内存空间;30. 明白:局域变量,全局变量;静态储备变量,动态储备变量;自动变量auto ,外部变量 extern ,静态变量 static(静态全局变量,静态局域变量),寄存器变量register;内部函数,外部函数;第 11 章 指针1. 变量相关的 3 方面的属性:值、地址、类型2. 类型说明符*变量名 ;3. &:取地址运算符;4. * :指针运算符(或称“间接拜访”运算符);5. 对* 要区分类型说明符与间接访拜访符;6. 不能用一个数给指针变量赋值,下面赋值是错误的(可用0 赋值)7. 给指针变量赋值时,指针变量前不能加“* ”说明符8. 指针变量未指向详细有效地址,间接拜访会有问题9. 指针变量的值是可以转变的10. 指针变量只能用同类型的地址赋值11. 同类型指针变量间可以相互赋值12. 一个变量有一个地址,一个数组包含如干元素13. 数组名就是这块连续内存单元的首地址(pi=&iArr0;pi=iArr;)14. 地址表达式( pi)- 整型表达式( in)15. 地址表达式( pi1)-地址表达式( pi12)16. 地址变量( pi)+ 或者 +地址变量( pi)17. 地址变量( pi) - 或者 -地址变量( pi)18. *pi+ :由于 +和*同优先级,结合方向自右而左,等价于*pi+19. *+pi :等价于 *+pi ;先 pi 加 1,然后 *pi20.*pi+ :先 *pi ,然后( *pi )加 121. pi+i1 和 iArr+i1 就是 iArri1 的地址22. *pi+i1 或* iArr+i1 就是 pi+i1 或 iArr+i1 所指向的数组元素,即iArr i123. 指向数组指针变量可以带下标,如pii1 与*pi+i1 等价24. 下标法,即用 iArri1 形式拜访数组元素,也可以用pii1 拜访数组元素;25. 指针法,即采纳 *iArr+i1 或*pi+i1 形式,用间接拜访的方法来拜访数组元素;26. 二维数组是以一维数组为元素构造的一维数组27. A, A 称为行地址28. Ai 和*A+i 称为列地址29.*A+1+2 : A+1 一行指针, *A+1 一列指针, *A+1+2一行二列地址30. 指向一维数组的指针int *pa4;31. 一个数组的元素值为指针,就该数组称为指针数组int *pa3;32. 指向指向整型指针的指针char *ppc;33. 返回指针值的函数int *fint x,int y 34. 指向函数的指针int*pfint,int; pf=max; *pf1,2;35. iArr1 是数组二维 iArr 的一个数组元素;同时,iArr1 是一个一维数组名;36. 行地址:二维数组 iArr34 中, iArri1 为大小为 4 的一维整型数组,就iArr+1 的值会跳过一个数组元素,即跳过大小为4 的一维整型数组 .37. 列地址:二维数组中,iArri 和 *iArr+i 是一维数组的数组名和首地址,iArri+1和*iArr+i+1 都会跳过一个整型数据;38. 行地址(一维数组地址) ,一次跳过一行,如iArr 、iArr+i1 、 &iArri1 、&*iArr+i1 ;39. 列地址(数据元素) ,一次跳过一列,如*iArr 、*iArr+i1 、iArri1 ;40. int *pia4 表示 pia 是一个指针变量, 它指向包含 4 个元素的一维数组; pia+1 就指向一维数组 iArr141. *pia+iRow+iCol是二维数组 iRow 行 iCol 列的元素的地址,而 *pia+iRow+iCol 就是iRow 行 iCol 列元素的值;42. 指向一维数组的指针:类型说明符* 指针变量名 数组长度 43. 指针数组:类型说明符* 数组名 数组长度 ;44. int *pa3;数组成员类型是 int * ,一维数组名 pa 是指向 int * 的指针常量,同样是指向其成员类型 (指向整形的指针) 的指针常量, 也就是说 pa 是指向指向整型指针的指针;45. 指向指针的指针:类型说明符* 变量名 ;46. 实参加形参的对应关系有以下4 种:( 1) 形参和实参都是数组名; ( 2) 实参用数组, 形参用指针变量; ( 3) 实参、形参都用指针变量; ( 4) 实参为指针变量,形参为数组名;47. 指向函数的指针:类型说明符* 指针变量名 参数表 ;48. 使用函数指针变量仍应留意以下两点:(1) 函数指针变量不能进行算术运算,这是与数组指针变量不同的; (2) 函数调用中 "* 指针变量名 " 的两边的括号不行少;49. 字符串常量是由一对双引号括起的字符序列;50.char cArr='C', ' ','l','a','n','g','u','a','g','e'数组 cArr 大小为 10;51. 可写利用字符串初始化为:char cArr="CLanguage";或去掉 写为: char cArr="C Language";数组 cArr 大小为 11;52. 对于字符数组可以有两种使用方式:( 1)当作单个字符看待; ( 2)当作字符串看待,全体合在一起,代表一个含义,使用数组名;53. scanf 的各输入项必需以地址方式显现,而数组名恰好是数组空间的首地址,所以数组名前不能用 & 符号;54. 当用 scanf 函数输入字符串时, 字符串中不能含有空格, 否就将以空格作为串的终止符;55. 清晰 scanf 和字符串指针之间的关系;56. 对字符串储备, 有用字符型指针变量指向字符串常量和依据字符数组储备两种方式,留意这两种方式的差异: (1)字符型指针变量指向字符串常量方式;( 2)字符数组方式;57. 明白字符串函数: 字符串输出函数 puts ;字符串输入函数 gets;测字符串长度函数strlen ;字符串连接函数strcat ;字符串拷贝函数strcpy ;字符串比较函数strcmp ;字符串查找函数 strstr ;58. 明白 main 函数的带参的形式59. 变量储备类别:动态储备区(栈);堆区;静态储备区;字符串常量区;程序代码区;60. 动态空间治理: ( 1)开创指定大小的储备空间malloc 函数;(2)按所给数据个数和每个数据所占字节数开创储备空间calloc 函数;( 3)重新定义所开创内存空间的大小realloc函数;( 4)将以前开创的某内存空间释放free 函数;第 12 章 自定义数据类型1. 结构体声明并不安排空间,结构体类型声明是在说明一种数据类型,并非变量定义;2. 直接定义结构体变量 : 省去了结构体名,而直接给出结构体变量;这种类型结构体只能用此一次, 以后无法再定义该结构体类型变量,即使再声明成员完全相同的结构体类型, 也和此次定义的结构体类型属于不同的结构体类型;3. 和其他类型变量一样,对结构变量可以在定义时进行初始化赋值;4. 引用结构变量成员的一般形式是:结构体变量名.成员名5. 结构变量之间可以像一般变量一样相互赋值;6. 不能对结构体变量整体进行输入、输出、运算;7. 结构体指针定义说明的一般形式为:struct结构名 * 结构指针变量名 ;8. 其拜访的一般形式为:* 结构指针变量 .成员名 ; 或为:结构指针变量 ->成员名9. 链表的精髓:struct student *pStrNext;10. struct student *pStrStuHead=0, *pStrStuTail=0;11. 枚举类型变量三种不同的定义方式12. 枚举值是常量,不是变量;不能在程序中用赋值语句再对它赋值;13. 枚举元素本身由系统定义了一个表示序号的数值,从0 开头次序定义为0,1, 2;14. 枚举元素不是字符常量也不是字符串常量,使用时不行以加单、双引号;第 13 章 文件1. 操作系统中的文件标识包括三部分:文件路径,文件名,文件扩展名2. 文件储备的两种方式:ASCII文件和二进制文件3. 文件指针名 =fopen 文件名 ,使用文件方式 ;4. fclose文件指针 ;5. int fgetcFILE *stream;6. int fputcint ch,FILE *stream;7. char *fgetschar *string, int n, FILE *stream;8. int fputschar *string, FILE *stream;9. int fwritevoid *ptr, int size, int items, FILE *stream;10. int freadvoid *ptr, int size, int items, FILE *stream;11. fscanf文件指针,格式字符串,输入表列;12. fprintf 文件指针,格式字符串,输出表列;13. rewind 文件指针 ;14. fseek文件指针,位移量,起始点;15. ferror 文件指针 ;16. feof 文件指针 ;17. clearerr 文件指针 ;18.