C语言知识点汇总(赵海英c语言课程笔记)

C语言知识点汇总

根据赵海英c语言课程整理,用于考研复试备考,主要是知识点,代码忽略的多,内容如有错误,欢迎指正

1、C语言三类语句:注释语句、定义语句、执行语句
2、五类执行语句:控制语句、函数调用语句、表达式语句、空语句、复合语句
3、C语言四类数据:常量(值不发生的量)、变量(用来存储常量)、表达式(用运算符连起来的合法式子)、函数(具有某个功能的一些代码,包括标准函数和用户自定义函数)
4、四类常量包括:整型常量(八、十、十六进制)、实型常量(小数和指数)、字符型常量(一个单个字符’a’、转义字符常量、字符型八进制、字符型十六进制)、字符串常量(由一对双引号括起来的若干字符串)
5、变量使用五规则:变量必须先定义后使用;变量名属于用户自定义标识符遵循其命名规则;同一函数内不能出现同名变量;同时定义多个变量,必须用逗号分隔;变量可赋初值,无初值是随机值
6、七类表达式:算术运算符及算数表达式(+ - * / %,%左右都是整型,符号与被除数一致);赋值运算符及赋值表达式(先计算后赋值,变量名=表达式);自增自减运算符、逗号运算符及其表达式(顺序求值,值为最后一个表达式的值);强制类型转换运算符;关系运算符及关系表达式(>、>=、<、<=、= =、!=,结果不是1就是0);逻辑运算符和逻辑表达式(&&、||、!,结果为0或1)
7、三类标识符:32个全为小写有固定的含义的关键字,如int;预定义标识符如scanf、printf;用户自定义标识符,如变量名、数组名、函数名(第一个字符为字母或下划线、其后为字母数字下划线)
8、四大类数据类型:基本类型(整型、字符型、浮点型、枚举类型)、构造类型(数组型、结构体型、共用体型)、指针类型()、空类型(void)
9、程序三大结构:顺序结构(从上往下顺序执行)、选择结构(从上往下有些执行有些不执行)、循环结构(从上向下,某些语句重复执行)
10、表达式优先级:( )(1级)、单目运算符(2级)、算数运算符(3、4级)、关系运算符(6、7级)、逻辑运算符(11、12级)、三目运算符(13级)、赋值运算符(14级)、逗号运算符(15级)
11、Switch语句规则:switch后必须用小括号将表达式括起;case后为常量整型或字符型,不能有变量和逗号运算符;各case后不能出现相同的值;与default顺序可以任意颠倒;case与default必须出现在switch语句中;程序执行到switch语句时计算小括号表达式的值然后与case匹配,调到匹配case处执行,直到break或结束;若没有case匹配成功;转到default后执行
12、break直接跳出循环,Continue只结束一次循环,继续执行下次循环
13、数组中的所有元素属于同一种数据类型,数组元素用数组名和数组下标来确定。一个数组元素其实就是一个变量。数组在内存中的分配是连续的,二维数组遵从先行后列原则。不能对数组整体引用,只能单独引用其中的元素。引用时下标可以是表达式(变量)。
14、数组的初始化多则出错,少则补零,一个也不给是随机值。只能在定义的同时对数组元素整体赋值,赋初值个数等于数组长度时,数组长度可以省略。二维数组可以省略行但不能省略列。
15、字符数组初始化时其初始值只能是字符,字符串最后都有一个字符串结束符’\0’,所以用字符数组存放字符串时一定要有一个元素存放结束符’\0’。
16、Scanf( )用%s输入时,遇到空格/回车符自动结束输入,printf输出字符串时从当前地址开始直到遇到结束符。gets( )只有遇到回车符时才结束,puts(字符数组或字符串常量),与%s格式输出一样,但只有puts( )会将’\0’转成’\n’输出。
17、字符串函数:strcat( )字符串连接函数,从第一个’\0’开始连入,第二个’\0’也连入,返回首地址;strcpy( )字符串拷贝函数;strcmp( )字符串比较函数,返回值相同位置不相同字符的ASCII码差值;Strlen( )求字符串长度函数,不包括结束符;
18、一个C语言程序可以由一个或多个源程序文件组成;一个源程序文件可以由一个或多个函数组成;C语言从main( )函数开始,结束于main( )函数,可调用其他函数;不能嵌套定义但可以嵌套调用,不能调用main( )(智能被OS调用)
19、函数分为有参函数和无参函数;也可分为库函数和用户自定义函数。
20、变量三属性:类型(常量、变量、表达式、函数)、作用范围(局部、全局)、存储类别(auto自动型、static静态型、register寄存器型、extern外部型)
21、局部变量:在函数内部定义的变量是局部变量,只在它所在的函数内有效;不同的函数中可以出现同名函数,它们属于不同的变量(互不干扰);复合语句中的变量只在复合语句中有效;所有形参都是局部变量
22、全局变量:在函数外部定义的变量为全局变量;全局变量的作用范围是从定义该变量开始到本文件的结束;全局变量可以在它的有效范围内被每一个函数引用;在同一文件中的全局变量和局部变量同名,局部变量屏蔽全局变量
23、四种存储类别:auto自动类别变量,用完后释放所占用空间,局部变量一般默认为auto类别,无初始化的时候,初值为随机值,使用时间较短的一般都为auto类别变量;static静态类别从定义到程序运行结束均占用存储空间,全局变量默认为static类别,无初始化时,初值为0,static类别变量只进行一次初始化;register寄存器类别变量优先将变量存放在寄存器中,一般不能直接使用;extern外部类别变量可以加大全局变量的作用范围。
24、预编译又称为预处理,通常在程序的编译之前。C语言提供的预编译主要有三种:宏定义、文件包含(说明程序需要引用到的文件)、条件编译(#if、#ifndef等,主要是进行预编译时进行有选择的挑选,防止对文件重复包含,#undef命令可以提前终止宏名的作用域)。
25、宏定义分为有参宏定义和无参宏定义,无参宏定义用一个指定的标识符来代表一串字符串,比如定义N为10,定义圆周率PI为3.14,在进行宏替换的时候原模原样替换不能随意加括号;带参宏定义提供了一种更加灵活的替换方式,在替换时,需要将形参改为相应的实参。
26、指针是内存地址,指针变量是用来存放内存地址的变量,不同类型的指针变量所占用的存储单元长度是相同的,但由于指针指向的地址存放的数据类型不同,内容所占的存储空间各有不同。
27、在定义指针变量时要和定义普通变量一样,前面必须有类型名;在定义指针变量时,指针变量名前必须有一个
号并不是指针变量名的一部分,只是一个标志;指针变量名只能用来存地址,禁止将一个整型值直接赋给指针变量。
28、通过&取地址运算符可以取出普通可以取出普通变量的地址。通过
指针运算符可以取出指针变量所指向的普通变量的值。
29、的三种含义:1、乘号2、指针变量的标志3、指针运算符
30、可以通过赋值(指针变量=&普通变量)使一个指针变量指向某一普通变量;在C语言中正确的做法是先让指针变量指向一个确定的存储单元后,再通过该指针变量引用它所指向的存储单元(定义且初始化后再用);变量名(普通变量、指针变量)都表示其存储单元的值;指针运算符放赋值=号左边为写,其余时候都为读;若指针变量p指向变量a,即将变量a的地址赋给了指针变量p;所有指针变量在内存中分配的字节数相同(2个字节)
31、口诀:地址变量得地址,得谁地址指向谁;有
为内容值,不是读就是写,放在=左边为写;无
为地址
32、&与互逆;与[ ]等价;&与[ ]互逆
33、指向数组元素的指针变量:由于数组元素与普通变量一样,所以定义指向数组元素的指针变量与定义指向普通变量的指针变量完全一样。
34、指向一维数组的指针变量:数组名代表数组的首地址,而且是一个地址常量;当指针变量指向数组中的某一个元素时时,指针变量+1,后指向数组的下一个元素,-1时指向数组前的一个元素;p+i等价于a+i等价于&a[i](地址三等价);
(p+i)等价于
(a+i)等价于a[i]等价于p[i](元素四等价);若两个指针变量指向同一个数组,这两个指针变量可以进行大小比较,结果为0或1,两个指针变量相减的结果是两个变量之间相差的个数;形参中的数组(局部变量)实际上是一个指针变量,并不是真正的数组,因为该“数组名”的值是可以改变的,而真正的数组名是不能被改变的;若形参是数组或指针变量,则在函数中可以通过形参改变实参的值
35、指向多维数组的指针变量:a+i是行指针,即指向的是一整行,若对它+1指向下一行;(a+i)与a[i]一样,都是一个列指针即指向的是一个元素;(a+i)+j与a[i]+j一样,都表示元素a[i][j]的地址。即与&a[i][j]等价,即地址三等价*(a+i)+ja[i]+j&a[i][j];元素四等价*((a+i)+j)==(a[i]+j)==(*(a+i))[j]==a[i][j]
36、指向多维数组元素(实际上是一维数组)的指针变量(列指针):指针p指向数组元素a[0][3],p+1指向下一个数组元素,p-1指向前一个数组元素。一维数组名:首地址;常量(不能放=左边);p=&a[0],列地址。
37、指向由m个元素组成的一维数组(实际上是一个二维数组)的指针变量(行指针):基类型 (*指针变量名)[m];(定义),前面括号和内容是行指针变量,后面m是列数,可以画二维表等价代换。二维数组名:首地址;地址常量;p=&a[0][0]行地址
38、指向字符串的指针变量:字符串”abc”是首地址;是地址常量;是第一个字符地址。
39、指向函数的指针变量:函数名和数组名一样,是起始地址,而且是一个地址常量。
类型名 *(指针变量名)( ),第二个括号是函数的标志,不需要定义形参。函数名:首地址;地址常量;函数地址。函数的指针变量只能指向函数的入口处,不能指向函数中的某条指令,所以对指向函数的指针变量+1是没有意义的。给指向函数的指针变量赋值时,只写函数名即可,不必些参数。
40、返回指针的函数:定义时 类型名 *函数名(形参列表){ …return 地址值;} 使用时:变量名=函数调用(返回一个地址值),且变量一定是一个地址变量。
41、指针数组:一个数组的所有元素均为指针类型。格式:类型名 *数组名[常量表达式],它的每一个元素都是一个指针类型(地址),即它的每一个元素都相当于一个指针变量。
42、指向指针的指针变量:用来存放指针变量地址的指针变量称为指向指针的指针变量。
定义格式:基类型名 **指针变量名
43、空指针:有值,值为1;所指空间不存在。*p=NULL,此时p的值为空,即p不指向任何有用的存储单元。尽管NULL的值为0,但我们不能认为p指向了地址为0的存储单元。当指针变量的值为空指针时,我们不能引用它所指向的存储单元,因为空指针无空间,不能进行读写操作。若某指针基类型为void型时,则引用时应该进行相应的强制类型转换。
44、结构体类型:先构造结构体类型;再定义结构体变量;最后使用结构体变量、结构体数组、结构体指针。
45、构造结构体类型时:定义成员的方式与定义普通变量的方式一样;成员列表必须用一对花括号括起;结构体名可以省略
46、结构体变量的初始化及引用:在定义结构体变量的同时可以将各成员变量的初值按顺序放在一对花括号中,来进行对结构体变量的初始化,若初值个数多于成员个数则出错,若初值个数少于成员个数则多余成员自动赋值;结构体变量不能整体引用,只能引用它的成员,引用结构体成员的方法:结构体变量名.成员名
47、指向结构体数据类型的指针:可以用指针变量指向结构体变量也可以用指针变量指向结构体变量的成员。要注意指针变量的类型一定要和它所指向变量的类型相同。当指针变量指向结构体变量时,对指针变量+1则跳过整个结构体而不是跳过一个成员。
48、当指针变量P指向结构体变量aa时,引用aa成员的方法。aa.num、(*p).num、p->num、
aa.score、(*p).score、p->score,每组的第一个都是用于普通变量,后两个只能应用于指针
49、指向结构体数组的指针:可以用结构体变量的成员作为实参,它与普通变量作为实参的用法是相同的;用结构体变量作为实参时,形参要求必须是同一结构体类型的变量,传递后形参与实参各对应成员是同类型的;也可以用结构体类型的地址(指针变量或数组)作为实参,要求形参必须是同一结构体类型的指针变量或数组,只要是地址传递,则可以通过形参来改变实参的值。
50、两种数据存储模式:数组(顺序存储随机访问)、链表(链式存储随机访问)
51、链表是一种数据结构,它采用动态分配存储单元。它能够有效地节省存储空间(同数组比较)。链表都有一个头指针head,用于指向链表的第一个元素(即用于存放链表中第一个元素的地址)。链表中的元素称为结点,链表中的所有结点都是结构体类型,且同一链表中的结点都是同一结构体类型。每个结点都应包括数据部分和下个结点地址两部分。链表的最后一个元素称为链尾,它不再指向其他结点(该结点的指针成员值为NULL)。链表的访问都是通过指针变量从头结点开始的。因为链表中的结点是一个结构体类型,并且结点中有一个成员用于指向下一个结点,因此在定义结构体变量的时候要定义一个指向结构体自身的指针。
52、动态存储分配函数用到的头文件是。malloc(size)函数作用是在内存的动态存储区中分配一个长度为size个字节的连续空间,函数返回值作为一个指向分配域起始地址的指针若分配失败则返回NULL。free( )函数作用是释放用malloc( )分配的内存。
53、开辟一个用于存放struct student数据的内存空间,并让p指向该空间:
Struct student *p=(struct student )malloc(sizeof(struct student));
用sizeof求出struct student这个类型所存储空间字节数,然后强制转化为与指针同类型
54、共用体类型:共用体中所有成员共用同一段内存(所有成员的起始地址都是一样的)。成员列表为定义该共用体的成员,成员定义的方式与普通变量一样;成员列表必须用一对花括号括起;共用体名可以省略;由于共用体类型变量的所有成员都共用同一段内存,所以共用体变量所占的字节数等于该共用体类型中占用字节数最多的成员所占的字节数。
55、共用体变量的引用:不能整体引用共用体变量,只能引用其成员。引用格式:共用体变量名.成员名;同成员共享值;在内存中整型数据的二进制数低8位占用前面一个字节,高8位占用后面一个字节(高位地址放高位,地位地址放地位),一个字符型数据占用一个字节,对于数组来说前面元素占用前面的字节;共用体变量之间可以相互赋值,赋值后两个变量应使用同一成员;共用体变量的地址与各成员的地址都相同的;在定义共用体时,可以对其初始化,但只能有一个初值且必须用花括号将初值括起。相当于给第一个成员赋值;共用体、结构体的成员均可以是共用体或结构体类型;不能用共用体类型变量作为函数参数;计算共用体占用字节数。
56、Typedef:在编程的时候可以使用typedef来定义新的类型名来代替已有的类型
格式:typedef 已有类型名 新的类型名;
Typedef可用于定义各种类型名,但不能定义变量。即只要见到typedef则该语句最后的标识符必定是一个类型名而不是变量名;typedef只能对已经存在的类型新增一个别名,而不是创造新类型。即在typedef后必须是一个已有的类型
57、位运算
位运算的操作对象只能是整型或字符型数据;6种位运算 &(按位与,全1为1,有0为0) |(按位或,有1为1,全0为0) ^(按位异或,相同为0,相异为1) ~(按位取反,0变1,1变0,对一个数按位取反得到的值为该数+1后再乘以-1) <<(按位左移,乘2的n次方) >>(按位右移,除2的n次方,若该数为负数且不能被2的n次方整除时得到的数为原数除以2的n次方再加-1)
58、符合运算符(11个):&=、|=、~=、<<=、>>=、+=、-=、
=、/=、%=、=
59、文件:记录在外部介质(外存)上的数据的集合,c语言中对文件的存取是以字符为单位的;分类:二进制文件(以二进制编码存储)和文本文件(ASCII码文件):每个字符存储到文件中;考试时,记住FILE就是文件类型名,它是一个结构体数据类型,对一个文件进行操作,通过文件指针进行。定义:FILE *fp,*in,*out;
60、文件的打开
格式:fopen(文件名,文件使用方式)
功能:按照指定的“使用方式”打开文件,函数返回所打开的指针,该指针的基类型为文件类型。文件名和文件使用方式均为字符串。
注:文件使用方式只能用小写字母,文件名用大小写均一样;在“文件使用方式”中若含有字母b,则打开的是一个二进制文件;当fopen打开失败时,函数返回NULL
61、文件的关闭(文件使用后应该关闭该文件)
格式:fclose(文件指针)
62、格式fputc(字符,文件指针)
功能:把一个字符写到文件指针所指的文件中。其中字符可以是字符常量也可以是字符变量。若输出成功则函数返回输出的字符,失败则返回EOF(stdio.h中定义为-1)
63、格式:fgetc(文件指针)
功能:从文件指针所指文件中读取一个字符。若读取成功则返回读取的字符,失败(遇到文件结束)则返回EOF
64、格式:fgets(str,n,fp)
功能:其中str表示一个字符指针,可以是字符数组名也可以是字符指针变量。从fp所指文件中读取n-1个字符(不是n个字符),并在这些字符的最后加一个字符串结束符’\0’后赋给str。函数返回str的首地址
65、格式:fputs(str,fp)
功能:向fp所指文件中写(输出)str中的字符串,str可以是字符串变量、字符数组或字符指针变量。在输出时字符串的结束符’\0’不输出。若输出成功则返回0,失败返回EOF。
66、格式:fread(buffer,size,count,fp)
fwrite(buffer,size,count,fp)
功能:用来读写一个连续的数据块。buffer:数据的地址;size:读写字节数:count:进行读写次数;fp进行读写的文件指针变量
注:这两个函数按二进制方式进行读写
67、格式:fprint(文件指针,格式说明符,输出列表);
fscanf(文件指针,格式说明符,输出列表);
功能:按格式说明符所指定的格式向文件中读或写(输入输出)数据。其中格式说明符和输入(输出)列表的用法与scanf和printf函数相同。
68、补充:feof(文件指针)作用是测试文件的当前读写位置是否在文件末尾,若是返回非0值(真),否则返回0(假)
69、格式:rewind(文件指针)
作用:使当前的读写位置重新指向文件的开头。函数无返回值
70、格式:fseek(文件指针,位移量,起始点)
功能:将当前的读写位置从“起始点”开始按“位移量”所指定的移动字节数向后移动。
起始点有:SEEK_SET 或0 (文件的开始)
SEEK_CUR 或1 (当前位置)
SEEK_END 或2 (文件的末尾)
位移量是长整型,故要在数值后面加字母l或L
71、将位置指针定位到离文件头0个字节的地方的方法。
法一:fp=open( );
法二:rewind(fp);
法三:fseek(fp,0L,0);
72、格式:ftell(文件指针)
功能:返回当前文件的位置用相对于文件头的位移量表示,若返回-1L表示出错
73、求文件长度的方法:

int filelength;
FILE *fp;
Fp=open();//fp指向文件头
Fseek(fp,0L,2);//fp指向文件尾
Filelength=ftell(fp);//头到尾(当前位置)的位移量

你可能感兴趣的:(C语言知识点汇总(赵海英c语言课程笔记))