C程序设计复习知识点总结_第1页
C程序设计复习知识点总结_第2页
C程序设计复习知识点总结_第3页
C程序设计复习知识点总结_第4页
C程序设计复习知识点总结_第5页
已阅读5页,还剩7页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C程序设计复习知识点总结一、C语言基础核心(必背)1.1C语言概述C语言特点:简洁、高效、灵活,可直接操作硬件,兼顾高级语言的易用性和低级语言的底层访问能力,广泛用于嵌入式、系统开发。C程序的结构:一个完整的C程序由头文件包含、函数定义(至少1个main函数,程序入口)、语句组成,执行顺序从main函数开始,到main函数结束(即使main函数在程序末尾)。程序的编译与运行:源文件(.c)→编译(gcc等编译器)→目标文件(.obj/.o)→链接→可执行文件(.exe);编译负责检查语法错误,链接负责关联库函数。1.2基本数据类型与常量、变量(1)基本数据类型(3类核心)整型:int(占4字节,范围-2¹⁵~2¹⁵-1或-2³¹~2³¹-1,取决于编译器)、short(短整型,2字节)、long(长整型,4/8字节)、longlong(长长整型,8字节);无符号整型加unsigned(如unsignedint,范围0~2³²-1)。实型(浮点型):float(单精度,4字节,有效数字6~7位)、double(双精度,8字节,有效数字15~16位);注意:float常量需加f(如3.14f),否则默认是double类型。字符型:char(占1字节,本质是ASCII码值,范围-128~127或0~255,取决于是否unsigned);字符常量用单引号(如'a'),字符串常量用双引号(如"abc"),字符串末尾默认隐含'\0'(结束标志)。(2)常量与变量常量:值不可改变,分为字面常量(如123、3.14、'A')、符号常量(用#define定义,如#definePI3.14,无分号,替换式定义,不分配内存)、枚举常量(enum定义,如enumSex{Male,Female},默认从0开始计数)。变量:值可改变,定义格式:数据类型变量名=初始化值(如inta=10;);注意:变量必须先定义、后使用,未初始化的局部变量值是随机的,全局变量默认初始化为0。标识符规则:由字母、数字、下划线组成,不能以数字开头,区分大小写(如a和A是两个不同变量);不能使用C语言关键字(如int、if、for等)。1.3运算符与表达式(1)优先级与结合性优先级:算术运算符>关系运算符>逻辑运算符>赋值运算符;结合性:大部分从左到右(如a+b+c),赋值运算符、单目运算符(如++、--)从右到左(如a=b=5)。(2)核心运算符算术运算符:+、-、*、/、%(取余);注意:/两边都是整数时,结果为整数(如5/2=2,不是2.5);%两边必须是整型(如5%2=1,5.5%2报错)。自增自减运算符:++(自增)、--(自减);前置(++a):先自增,再使用;后置(a++):先使用,再自增(如inta=3;printf("%d",a++);输出3,a变为4)。关系运算符:>、<、>=、<=、==(等于)、!=(不等于);结果是逻辑值(1代表真,0代表假),注意:不能用=代替==(如if(a=5)是赋值,不是判断)。逻辑运算符:&&(逻辑与,全真为真)、||(逻辑或,一真为真)、!(逻辑非,真变假,假变真);短路特性:&&前为假,后面不执行;||前为真,后面不执行(如0&&(a=3),a不会被赋值)。赋值运算符:=、+=、-=、*=、/=、%=(如a+=3等价于a=a+3)。(3)表达式由运算符和操作数组成(如a+3、x>5),表达式有值和类型(如3+5的值是8,类型是int);注意:表达式末尾加分号变成语句(如a=5;是赋值语句)。二、C语言流程控制(重点,必考)2.1顺序结构最基础的结构,语句按书写顺序依次执行,无分支、无循环;如变量定义、赋值、printf输出等语句的顺序执行。2.2分支结构(if-else、switch)(1)if-else语句基本格式:if(条件表达式){语句块1;}else{语句块2;};条件表达式为真(非0)执行语句块1,否则执行语句块2。嵌套if-else:if里面嵌套if,注意else的匹配规则(else总是与最近的、未匹配的if配对),建议用大括号{}明确语句块范围,避免歧义。多分支if-else:if(条件1){...}elseif(条件2){...}else{...};依次判断条件,满足一个即执行对应语句块,后续不再判断。(2)switch语句基本格式:switch(表达式){case常量1:语句1;break;case常量2:语句2;break;...default:语句n;break;}注意事项:表达式必须是整型或字符型(不能是float、double);case后的常量必须是字面常量/符号常量,不能重复;break的作用是跳出switch,若省略break,会继续执行下一个case的语句(穿透现象);default可选,当所有case都不匹配时执行。2.3循环结构(for、while、do-while)(1)for循环(最常用)格式:for(初始化表达式;条件表达式;更新表达式){循环体;}执行流程:1.执行初始化表达式(仅1次);2.判断条件表达式,真则执行循环体,假则退出循环;3.执行更新表达式;4.重复步骤2-3。注意:三个表达式均可省略(如for(;;)是无限循环),但分号不能省略;循环体若只有一条语句,大括号{}可省略,但建议保留,避免出错。(2)while循环格式:while(条件表达式){循环体;}执行流程:先判断条件,真则执行循环体,假则退出;注意:若条件一开始就为假,循环体一次都不执行;避免出现无限循环(如while(1),需在循环体内加break退出)。(3)do-while循环格式:do{循环体;}while(条件表达式);执行流程:先执行一次循环体,再判断条件,真则继续循环,假则退出;特点:循环体至少执行1次(区别于while循环)。(4)循环控制语句break:跳出当前循环(或switch语句),不再执行循环后续内容。continue:跳过本次循环的剩余语句,直接进入下一次循环的条件判断(不跳出循环)。goto:无条件跳转到指定标签(如gotolabel;label:...),不建议使用,容易导致程序结构混乱。三、数组(核心模块,常考应用题)3.1数组的定义与初始化定义格式:数据类型数组名[数组长度];(如intarr[5];定义一个长度为5的int型数组);注意:数组长度必须是常量(不能是变量,如intn=5;intarr[n];错误)。初始化:

完全初始化:intarr[5]={1,2,3,4,5};部分初始化:intarr[5]={1,2};未初始化的元素默认值为0(局部数组未初始化是随机值,全局/静态数组默认0)。省略长度初始化:intarr[]={1,2,3,4,5};数组长度由初始化元素个数自动确定(此处长度为5)。数组的下标:从0开始(如arr[0]是第一个元素,arr[4]是第五个元素);注意:下标不能越界(如arr[5]对于长度为5的数组是越界,会访问非法内存,导致程序崩溃)。3.2一维数组的使用数组的输入输出:通过循环遍历数组,逐个输入(scanf)或输出(printf)元素(如for(inti=0;i<5;i++){scanf("%d",&arr[i]);})。数组的常见操作:求数组最大值、最小值、总和、平均值,数组排序(冒泡排序、选择排序)。冒泡排序核心逻辑:相邻两个元素比较,若前面大于后面(升序),则交换,重复多次,直到数组有序(如intarr[5]={3,1,4,2,5};排序后变为1,2,3,4,5)。3.3二维数组(重点,应用题常考)定义格式:数据类型数组名[行数][列数];(如intarr[3][4];3行4列的二维数组,共12个元素);行数和列数均为常量。初始化:

按行初始化:intarr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};简化初始化:intarr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};按行顺序填充。省略行数初始化:intarr[][4]={1,2,3,4,5,6};行数由元素个数和列数自动确定(此处行数为2),列数不能省略。二维数组的访问:arr[i][j](i是行下标,j是列下标,均从0开始);遍历需用双重循环(外层控制行,内层控制列)。四、函数(核心,必考,贯穿整个C语言)4.1函数的定义与声明(1)函数定义格式返回值类型函数名(参数列表){函数体;return返回值;}返回值类型:函数执行后返回的数据类型(如int、float、char),无返回值用void(此时return可省略,或写return;)。参数列表:函数接收的输入数据,格式为“数据类型参数名”,多个参数用逗号分隔(如intadd(inta,intb));无参数写void(如voidprint())。函数体:函数的核心逻辑,包含变量定义、语句执行等;return的作用是返回值,并结束函数(return后的数据类型必须与返回值类型一致)。(2)函数声明作用:告诉编译器函数的返回值类型、函数名、参数列表,避免编译器报错(函数调用在定义之前时,必须声明)。格式:返回值类型函数名(参数列表);(与函数定义的头部一致,末尾加分号),如intadd(inta,intb);。位置:通常放在头文件包含之后、main函数之前。4.2函数的调用调用格式:函数名(实参列表);(实参的类型、个数必须与形参一致,如intsum=add(3,5);)。参数传递:C语言默认是值传递(实参的值复制给形参,形参的修改不影响实参);若要修改实参的值,需使用指针传递(见第五节)。函数的嵌套调用:函数内部调用另一个函数(如main函数调用add函数,add函数调用print函数),嵌套层数无限制(合理即可)。函数的递归调用:函数自身调用自身(如求阶乘、斐波那契数列);注意:必须有递归终止条件(否则会无限递归,导致栈溢出),递归次数不宜过多。4.3函数的分类按返回值分:有返回值函数(如add函数)、无返回值函数(void类型函数)。按参数分:有参函数(如add(inta,intb))、无参函数(如voidprint())。按作用域分:库函数(C语言自带,如printf、scanf、strlen,需包含对应头文件,如#include<stdio.h>)、自定义函数(用户自己定义的函数)。4.4常用库函数(必记)输入输出函数(stdio.h):printf(输出)、scanf(输入)、getchar(读取单个字符)、putchar(输出单个字符)。字符串函数(string.h):strlen(字符串)(求字符串长度,不包含'\0')、strcpy(目标字符串,源字符串)(复制字符串)、strcmp(字符串1,字符串2)(比较字符串,返回0表示相等,正数表示1>2,负数表示1<2)。数学函数(math.h):sqrt(数)(求平方根)、pow(底数,指数)(求幂)、abs(整数)(求绝对值),使用时需在编译时加-lm(如gcctest.c-otest-lm)。五、指针(难点,常考,重点掌握基础用法)5.1指针的基本概念指针的本质:变量,用来存储内存地址(内存单元的编号,如0x0012ff44);通过指针可以间接访问内存中的数据。指针的定义格式:数据类型*指针名;(如int*p;定义一个指向int型数据的指针p);注意:*表示指针类型,数据类型必须与指向的变量类型一致(如int*p不能指向float型变量)。指针的赋值:指针变量只能存储地址,不能直接存储普通数值;如inta=10;int*p=&a;(&是取地址符,&a表示变量a的内存地址,将地址赋值给p,此时p指向a)。5.2指针的使用(核心操作)间接访问(解引用):用*指针名访问指针指向的变量的值(如inta=10;int*p=&a;printf("%d",*p);输出10);*p等价于a,修改*p会直接修改a的值(如*p=20;则a=20)。指针的运算:

指针加减整数:p++(指针向后移动一个所指向数据类型的大小,如int*p,p++移动4字节);p--同理。指针减指针:两个同类型指针相减,结果是两个指针之间的元素个数(如intarr[5];int*p1=&arr[0],*p2=&arr[3];p2-p1=3)。空指针:int*p=NULL;(NULL是C语言定义的空指针常量,值为0,指向空地址,不能解引用(*p报错),用于避免野指针)。野指针:未初始化、未赋值或指向非法内存的指针(如int*p;未初始化,p的值随机,是野指针),使用野指针会导致程序崩溃,需避免。5.3指针与数组(重点关联)数组名的本质:数组名是数组首元素的地址(如intarr[5];arr等价于&arr[0]),是一个常量(不能修改,如arr++错误)。指针访问数组元素:intarr[5]={1,2,3,4,5};int*p=arr;则*p=arr[0](1),*(p+1)=arr[1](2),*(p+i)=arr[i](i为下标);遍历数组可通过指针p++实现。指针数组:数组的每个元素都是指针(如int*arr[5];定义一个长度为5的数组,每个元素是int型指针),常用来存储多个字符串(如char*str[]={"abc","def","ghi"})。5.4指针与函数(重点,应用题常考)指针作为函数参数:将变量的地址传递给函数形参(指针),函数内部通过解引用修改实参的值(解决值传递无法修改实参的问题)。示例:voidswap(int*a,int*b){inttemp=*a;*a=*b;*b=temp;};调用时传入&a、&b,即可交换a和b的值。函数返回指针:函数的返回值可以是指针(返回内存地址),注意:不能返回局部变量的地址(局部变量在函数结束后释放,地址变为非法),可返回全局变量、静态变量或动态分配内存的地址。六、字符串(高频考点,结合数组、指针考查)6.1字符串的定义与初始化字符串的本质:以'\0'(空字符,ASCII码值为0)为结束标志的字符数组。定义方式:

charstr1[]="abc";(自动在末尾添加'\0',数组长度为4)。charstr2[]={'a','b','c','\0'};(手动添加'\0',否则不是字符串,是普通字符数组)。char*str3="abc";(指针指向字符串常量,字符串常量存放在只读内存区,不能修改(如str3[0]='A'报错))。6.2字符串的输入输出输入:scanf("%s",str);(str是数组名,无需加&,因为数组名是地址);注意:scanf读取字符串时,遇到空格、回车、制表符会停止,无法读取含空格的字符串。读取含空格的字符串:用fgets(str,长度,stdin);(如fgets(str,100,stdin);读取最多99个字符,包含空格,会读取回车符)。输出:printf("%s",str);(自动输出到'\0'为止,不输出'\0')。6.3字符串的常用操作(结合string.h库函数)求长度:strlen(str)(返回字符串中有效字符的个数,不包含'\0',如strlen("abc")=3)。字符串复制:strcpy(str1,str2)(将str2的内容复制到str1,包括'\0',注意str1的空间要足够大,否则会溢出)。字符串拼接:strcat(str1,str2)(将str2拼接在str1后面,str1的空间要足够大)。字符串比较:strcmp(str1,str2)(按ASCII码值逐字符比较,返回值:0→相等,正数→str1>str2,负数→str1<str2);注意:不能用==比较字符串(比较的是地址,不是内容)。七、结构体与共用体(基础掌握,选考)7.1结构体(struct)作用:将不同类型的数据(如int、char、float)组合在一起,形成一个新的自定义数据类型(如描述一个学生的姓名、年龄、成绩)。结构体定义格式:

struct结构体名{

数据类型成员名1;

数据类型成员名2;

...

};

//示例:描述学生

structStudent{

charname[20];//姓名

intage;//年龄

floatscore;//成绩

};结构体变量的定义与使用:

定义:structStudentstu1;(struct不能省略,除非用typedef重定义)。赋值:stu1.age=18;strcpy(,"ZhangSan");stu1.score=95.5;(用.访问结构体成员)。指针访问:structStudent*p=&stu1;p->age=18;(用->访问结构体指针的成员)。7.2共用体(union)作用:多个成员共用同一块内存空间(节省内存),同一时间只能有一个成员有效(修改一个成员,会覆盖其他成员的值)。定义格式:union共用体名{数据类型成员名1;数据类型成员名2;...};(用法与结构体类似,但内存共用)。特点:共用体的大小等于最大成员的大小(如unionU{chara;intb;},大小为4字节,与int型成员b一致)。八、文件操作(基础掌握,常考简单读写)8.1文件操作的基本概念文件:存储在外部存储设备(如硬盘)中的数据集合,C语言中用文件指针(FILE*)操作文件。文件打开与关闭:操作文件前必须打开,操作结束后必须关闭(避免资源泄露)。8.2核心文件操作函数(stdio.h)打开文件:FILE*fopen(constchar*filename,constchar*mode);

filename:文件名(如"test.txt");mode:打开方式("r"→只读,文件不存在则报错;"w"→只写,文件不存在则创建,存在则清空;"a"→追加,文件不存在则创建,写入内容追加在末尾;"r+"→读写,文件不存在则报错)。返回值:成功返回文件指针,失败返回NULL(如fopen("test.txt","r")==NULL表示打开失败)。关闭文件:intfclose(FILE*fp);(fp是文件指针),成功返回0,失败返回EOF(-1)。文件读写:

字符读写:fgetc(fp)(从文件读取一个字符,失败返回EOF)、fputc(ch,fp)(将字符ch写入文件,失败返回EOF)。字符串读写:fgets(str,len,fp)(从文件读取一行字符串)、fputs(str,fp)(将字符串写入文件)。格式化读写:fscanf(fp,"%d",&a)(从文件按格式读取数据)、fprintf(fp,"%d",a)(将数据按格式写入文件

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论