更多课程 选择中心

C/C++培训
达内IT学院

400-111-8989

初学C语言必须掌握的75个知识点

  • 发布:网络
  • 来源:网络
  • 时间:2018-03-07 10:14

1、C语言中整数默认为INT型,两个整数相除(如1/2)结果仍然是整数,要得到带小数点的答案则要改成1.0/2

2、在C语言中,“=”是赋值运算符,表示把某个值赋给某个变量(X=0即把0值赋给X变量);“==”是关系运算符,表示“等于”(X==0即X等于0),在编写C程序时要注意区分。

3、1个字节等于8位二进制(某整形数据按照2字节在内存中分配空间,即该数据对应的二进制形式是16位二进制);在ASCⅡ码中,英文字母(不分大小写)、英文标点占一个字节,中文汉字、中文标点占两个字节。

4、基本运算符的优先等级------(PS:手机无法显示部分符号)“!”than算术运算符(+/-/*)than关系运算符than逻辑运算符than赋值运算符(=);要想从C菜鸟变成C老手,一些基本的优先等级是必须知道的(C运算符的优先等级详见附录C)

5、关于putchar函数------putchar函数即字符输出函数,表示向输出设备(显示器)输出一个字符。无论用户输作何种输入,函数都只会输出字符(putchar(65)输出结果是“A”,putchar(„65‟)输出结果是“65”);putchar函数可以通过输出控制字符,让程序执行某种指令(putchar(„\n‟)则程序会执行换行指令)。

6、教材在介绍格式符的章节里有不准确的地方(见P33)------d格式符、s格式符、f格式符的介绍里,“m”应是最少输出位数(书上的描述是“总位数”):%md,%ms,%mf,分别对应------输出最少m位整型数据,m位字符串,m位浮点数,位数不足时左补空格。

7、对于我们来说,C语言不仅是一门必修课。现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机,单片机的前景是很广阔的(有兴趣的同学可以向老师咨询或者上网了解),要设计出现代化的电子产品无疑要懂得用单片机。单片机的运行全靠程序,不把程序设计学好如何谈得上使用?所以,希望各位能够重视C语言这门课程。

8、定义变量时不能使用赋值语句。”int i=j=k=0;”这种定义方法有误,要正确定义变量并对变量进行初始化,则应修改成“int i=0,j=0,k=0;”(顺带提醒一下,每个语句的结尾都应该添上“;”)

9、关于if语句------“if()”括号里面输入的数据或表达式是其判定条件,只要数据或表达式对应的值非零,便会执行if语句之后的语句,反之不执行。(如语句“if(a=0)”,具体是把0值赋给a,括号里的数值是0,则不执行if语句之后的内容)

10、基础知识巩固------结构化程序设计的三种基本结构:顺序结构、选择结构、循环结构;算法的4种表示方式:自然语言、伪码、流程图、N-S图。对于一些基础的C语言知识最好能够做到心中有数,不仅是为了巩固基础,这些内容以后考试也会涉及到的。

11、强制类型转换------运用强制转换运算符可以实现对变量的数据类型进行转换,强制转换运算符的格式为“(类型名)”,如(int),是其中一种强制转换运算符。(int)x+y------只对变量x进行强制转换;(int)(x+y)------对x+y的值进行强制转换。

12、条件运算符------运算优先等级低于关系运算符,高于赋值运算符。条件运算符的结合性是自右至左,使用时有以下技巧:第一个条件运算符的“:”后面的内容加上括号(手机无法正常显示例子,详见P46中条件运算符的介绍)。

13、利用关系运算符对字符和数据进行比较时,要先将字符转换成对应的ASCⅡ值。如“if(A==65)”,要先将A转换成对应的ASCⅡ值(65),再和65进行比较。

14、continue语句和break语句的使用:continue语句的作用只是跳过该次循环,转而进入下一次循环条件的判断,并不会中止整个循环;break语句只能用在switch语句和循环体内,在循环体内的作用是直接终止整个循环体,不再进行任何循环条件判断和执行循环体内的语句。

15、对于无符号变量,二进制的最高位代表数据的最高位;对于有符号变量,二进制的最高位数代表数据的符号位,仅用来决定数据是正数还是负数,在进行反码、补码运算时不参与运算。

16、使用case语句时一定要在case后面加空格(如“case 1”),否则系统会把case与常量表达式一同识别为一个标识符(如“case1”,是一个标识符);case后面一定要是一个常量表达式,不能是关系表达式或者别的表达式------常量表达式,必须的~

17、字符与字符,字符与数据均可以通过关系表达式进行比较。进行比较时,字符先转换成对应的ASCⅡ值。(if(A>B)先把A、B分别转换成65、66;if(65>B)先把B转换成66)

18、逻辑运算符“非”(“!”)------书上说的原值取反并非取相反数。逻辑“非”的运算法则中,“取反”是“取反义值”:对非0值取0(如“!2”等于0,代表“假”),对0取非0值(如“!0”等于1,代表“真”);凡是非0值都能代表“真”,C语言中的“真”默认用数值“1”来表示(即当运算结果为“真”时对应的数值是1)。

19、循环结构中要让变量进行自增或自减时,既可以使用前缀自增自减(如++i,--i),也可以使用后缀自增自减(如i++,i--),互换两种增减方式对循环结构不造成影响,编写C程序时可按照自己的个人习惯进行选择。(由于自增自减在循环结构中一般是独立语句,所以可以互换)

20、编译器在求解逻辑表达式的值时,采用“非完全求解”的方法,并不是所以的逻辑运算符都被执行,只有在需要执行下一个逻辑运算才能求出表达式的解时,才继续运算(如“0&&2&&3”,0代表假,后两个表达式不必判断,运算立即终止)

21、goto语句------goto语句的作用是无条件转向“语句标号”处执行(如“ibm:x=a”中,“ibm:”即为“语句标号”);“语句标号”仅仅对goto语句有效,“语句标号”后面的语句在程序中照样会执行,也就是说“语句标号”不影响其后语句的执行,只是一个标记;因为无条件转向使程序结构无规律、可读性差,一般应避免使用goto语句,除非它能大幅提高程序的执行效率。

22、1、强烈建议大家在写复杂程序之前先把算法写出来!!!!!!(一般来说,采用流程图来写算法比较方便)2、while语句------条件符合时执行语句,直到不符合条件;do-while语句------先执行语句,再进行判定,条件符合时继续执行语句。两种“while”语句要视实际情况来使用。

23、用printf来输出浮点型数据时,一般格式为【printf(“%f”,浮点型变量或浮点型常量)】,系统默认输出的浮点数有6位小数,如果需要增加或减少输出的小数位数,可以利用格式【printf(“%.nf”, 浮点型变量或浮点型常量)】,其中的n表示了输出的浮点数的小数位数。(PS:用格式【printf(“%lf”, 浮点型变量或浮点型常量)】无法改变小数位数)

24、如果被调函数的返回值是整型或字符型,可以不对被调函数进行声明,而直接调用。这时,系统将自动对被调函数的返回值按整形处理。(也就是说,在没有对函数返回值进行定义的情况下,系统默认为整型量)

25、关于无参函数------一般情况下,无参函数没有返回值,此时函数类型标识符可以写为void,向系统表明该函数将不会返回任何值。此外需要说明的是,如果要定义带返回值的无参函数,也是可以的。(无参函数也可以有返回值,不过一般情况下让它有返回值也没多大意义)

26、形参变量只有在函数被调用时才分配内存单元,在调用结束时,便会释放所分配的内存单元。因此,形参只在本函数内部有效,函数调用结束返回主调函数后则不能再使用该形参变量了。(也就是说,形参变量在使用过后便会“消失”)

27、关于函数参数------把某个函数A作为另一个函数B的实际参数时,必须保证A函数有返回值【如sqrt(sum(a,b)),sum函数必须有返回值】;如果在A函数内,B函数和C函数同时充当A函数的实际参数,则按照自右向左的顺序求值(当求值顺序会影响函数结果时就要注意这一点)。【如printf(“%d,%d”,sum(a,b),sqrt(c)),先计算sqrt函数的值】

28、“void”是其中一个C语言关键字,用来对函数类型进行声明,表明函数不会有返回值;被“void”声明了的函数不能用来给变量赋值,因为函数是没有值的。

29、主函数放最后的话,可以不用进行函数声明(如“void fun(long)”,是一个函数声明);如果主函数不是放在最后,要保证所有函数在main函数出现之前已经声明了函数类型和形参变量类型。

30、初学者编写函数时的常见错误:Ⅰ、函数体的花括弧或复合语句的花括弧不配对;Ⅱ、调用函数时,实参与形参在个数、类型以及顺序上不匹配;Ⅲ、调用库函数时忘记# include语句,调用自定义函数时忘记进行函数声明。(其中第三点是最常见的错误,记得调用库函数时要加头文件)

31、主函数中定义的变量只能在主函数中使用,不能在其他函数中使用。同时,主函数中也不能使用其他函数中定义的变量。主函数也是一个函数,虽然被称作“主函数”,但实际上它与其他函数是平行关系,应予以注意。

32、关于全局变量------1.它不属于哪一个函数,它属于一个源程序文件;2.其作用域是整个源程序(在哪个函数哪个复合语句中都能取用);3.所有全局变量的储存位置都是静态储存区。

33、全局函数建议尽量少用,原因:1.全局变量在程序的全部执行过程中都占用着存储单元;2.降低函数的独立性,继而降低程序的可靠性,同时也不利于将来程序的移植(最主要的原因,用太多的全局变量会导致函数移植后难以独立使用);3.使用过多的全局变量,会使程序的可读性降低,人们往往难以明确判断各个时刻各变量的取值。

34、关于自动变量(auto)------函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中,函数中的形参变量和在函数中定义的局部变量(包括在复合语句中定义的变量)都属此类,在调用这种函数时系统会自动给他们分配空间,在函数调用结束时将自动释放这些空间。(最大的特点是函数调用完毕后会“消失”)

35、#include------文件包含指令,一个include命令只能指定一个被包含文件(也就是说,要包含多个文件,则需要用多个include命令);文件包含允许嵌套,即在一个被包含的文件中还可以包含另一个文件。

36、寄存器变量------为了提高效率,C语言允许将频繁使用的局部变量的值存放到CPU的寄存器中,这种变量成为“寄存器变量”,用关键字register来声明;会“消失”的变量才可以作为寄存器变量(如局部自动变量、形参变量);寄存器变量的数目是有限的,不能任意定义。

37、静态局部变量------静态局部变量储存在静态储存区;如果不给静态局部变量赋初值,则系统自动赋其0值;静态局部变量只能进行一次初始化(即赋初值,如“int x=0”)

38、关于无参数宏------无参数宏可以用来替代常数和表达式;无参数宏的定义必须在函数外,作用域为自宏定义命令起到源程序结束(定义之后就能用到最后);宏定义后面不用加分号。

39、关于带参数宏------带参数宏在进行替换时,保留函数中的实参(可以理解成把宏替换掉后再将实参“放回去”);定义带参数宏时,为了避免程序在执行过程中出现副作用,需要加两重括号:第一重括号加在形参上,第二重括号加在整个字符串上(如“#define M(x) ((x)*(x))”)

40、关于指针型变量------指针型变量只能存放变量的地址,赋值时只能赋予地址;未经赋值的指针变量不能使用(有可能导致死机);定义指针时的类型说明符:表示了指针型变量指向的变量的数据类型(可记成“指向类型”)。

41、数组和指针型变量的联系------数组名是一个地址,可以把数组名赋予指针型变量(假设p是指针型变量,执行语句“p=a”后,p指向数组a的第一个元素a[0]);若已经把数组名赋予指针型变量,则指针型变量可以通过加减运算改变其对数组a的指向(执行语句“p=a;p=p+2;”后,p指向数组a的第三个元素a[2])。

42、指针变量的初始化------指针变量必须进行初始化才能使用,一般格式有两种,一种是同时进行类型说明和赋值(如int *p=&x;),一种是把类型说明和赋值分开进行(如int *p;p=&x;),初始化必须包括类型说明和赋值。

43、指针运算符------符号为“*”,作用是返回一个指针所指向的对象的值。(如“int *p=&x;i=*p;”,语句“i=*p;”在执行时先执行指针运算符,把p指向的变量x的值调出来,然后把该值赋给变量i)

44、对指针变量进行赋值------定义两个指针变量p1,p2,“int *p1=&x,*p2=&y”,当执行语句“p1=p2”时,p2的值对应的是y的地址,把该值赋予p1,则此时p1的值也会变成y的地址;当执行语句“*p1=*p2”时,p2指向的变量y的值会被赋予p1指向的变量x。

45、如果要把指针变量p指向数组a的第一个元素,可以使用下面的语句:“p=&a[0];”,或“p=a;”两种赋值方式是完全等效的。(这里的“a”就是“a[0]”的地址)

46、关于空指针------空指针不同于未赋值的指针变量,空指针可以使用而未赋值的指针变量不能;空指针不指向任何变量,对应的值是0(假设p是一个空指针,则有p==0)。

47、二维数组的两种赋值------设p是指针变量,a是一个二维数组,运行语句“p=a”后,p指向二维数组的第一行;运行语句“p=a[0]”后,p指向二维数组的第一行第一个元素a[0][0]。

48、二维数组行指针和列指针------假设a[i][j]是一个二维数组,则“a+m”指向二维数组的第m行,是一个行指针;*(a+m)是一个列指针,指向第m行第0列(控制由行转为列,但仍为指针);*(*(a+m))是数组元素a[m][0]的值。

49、函数中的指针变量------函数中的指针变量用来对主函数中的变量进行运算,这是指针变量在函数中的重要应用;关于数组名------数组名是数组第一个元素的首地址,它不是一个变量,不能对其数值进行更改;

50、调用形参为指针类型的函数时,注意要保证函数内新增添的指针变量已经进行定义和初始化,并且要在运行程序之前做好检查,确保调用函数时没有对无关地址的内容进行修改,这样便能避免严重后果的发生。(运用指针进行编程确实需要小心谨慎)

51、字符串及其操作------对字符变量进行赋值时使用的必须是一对单引号,使用双引号来赋值属于非法操作;C语言中空字符用‟\0‟来标识,此处的‟\0‟实际上是指八进制的0。

52、指向指针的指针------指针变量也有自己对应的地址,这个地址储存的是指针变量的值(具体为另外某个变量的地址);可以把指针变量(假设是P1)的地址值赋予另外一个指针变量(假设是P2),则此时P2指向P1,P2是一个指向指针的指针。

53、关于字符数组------字符型与整型互相通用,因此int a[i]也可以定义为字符数组。但两种类型分配的字节不同,用整型来定义会浪费空间,另外这样定义的实际意义也不大,这里只是为了说明其合法性。(不知道考试会不会涉及到这种内容所以给大家提点一下)

54、字符串连接函数strcat()------用于把两个字符串连接在一起,组成一个字符串。用法如下:strcat(str1,str2),其中str1和str2是两个字符串,该函数把str2连接在str1中的字符串后面,并删除原来str1后面的空字符。使用该函数须保证str1能够储存连接后的长字符串。

55、字符串比较函数strcmp(str1,str2)------按照字符的ASCⅡ值,对两个字符串自左向右逐个字符比较大小,直到遇到不同字符或同时遇到空字符为止。同时遇到空字符时函数的返回值为0;遇到不同字符时,比较两个字符的ASCⅡ值,当属于str1的那个字符的ASCⅡ值较大时,函数的返回值大于0,较小则函数返回值小于0。

56、字符串copy函数strcpy(str1,str2)------该函数的作用是把某个字符串数组的内容复制到另外一个字符串数组中。执行strcpy函数后,则str1中的内容变成str2中的内容,使用时要保证字符串数组str1有一定的长度,足够容纳str2的内容。(三个字符串函数的用法都比较容易把握,别把函数名记错就没问题了)

57、测试字符长度函数strlen(str1)------用于测试字符串的实际长度,其中不包括空字符,str1可以是字符串或字符数组。(灵活调用各种字符串处理函数能够实现许多不同的功能,希望大家能够熟练掌握)

58、结构体和结构体变量的定义------结构体的定义方式:struct 结构体名{成员表;},成员表中的各个部分必须包括成员类型及成员名;结构体变量的定义方式:struct 结构体名 结 构体变量,结构体变量可以有多个,各个变量之间用逗号间隔开来。

59、结构体和结构体变量的定义(2)------一共有三种方法:1、定义结构体,再定义结构体变量;2、定义结构体类型的同时定义结构体变量;3、利用无结构体类型名定义变量(第一种和第二种比较常用,由于篇幅的限制,具体的定义形式详见教材p152——p153。PS:三种定义方法都有提及到结构体嵌套,虽然篇幅很少,但也要注意一下)

60、定义了结构体变量后,系统要为变量分配内存空间。在内存中,结构体变量占有连续的一段内存空间:结构体变量占用的一段连续内存空间=结构的各成员所占用的内存空间之和。

61、结构体数组------以结构体变量作为元素的数组即为结构体数组(PS:XX数组就是以XX变量作为元素的数组),和结构体变量的定义十分相似,结构体变量的定义方式有三种:先定义结构体,再定义结构体数组;定义结构体类型的同时定义结构体数组;利用无结构体类型名定义结构体数组。(同样由于篇幅限制,具体定义格式详见P156)

62、字符串的输入和输出(1)-------用scanf()和printf()进行输入和输出字符串时,双引号内应出现%S,输入项处应放入字符串数组的数组名(如printf(“%s”,str1),其中str1是数组名,虽然输出的是str1的内容,但这种格式的输出只要放入数组名就可以了)。

63、用puts()和gets()来进行输入输出字符串时,要保证括号内的是单个字符数组名(是字符数组名,而不是字符串数组名)。另外,利用puts()函数进行字符串输出时,要保证括号内数组名对应的数组的末尾是一个空字符,否则会出现奇怪的输出结果。

64、成员运算符------“.”是成员运算符,在所有运算符中它的级别最高。因此,在程序中的任何地方,“结构体变量名.成员名”都是整体出现的。(也就是说,我们可以习惯地把“结构体变量名.成员名”看成一个整体)

65、结构体指针变量------当一个指针变量用来指向一个结构体变量时,称之为结构体指针变量;结构体指针变量的声明:struct 结构体名 *p,“struct 结构体名”可视作一个类型说明符(int、char、float这些就是类型说明符)。

66、结构体指针变量的含义:如果p是一个结构体指针变量,则p指向一个具有结构体名对应的结构的结构体变量(如struct student *p,此时p指向具有“student”结构的结构体变量)。

67、指向运算符------利用结构体指针引用结构体成员时,一般会用到指向运算符;指向运算符拥有最高的优先级别(和成员运算符是同一个优先级别的),结合方向从左到右;设sp是一个结构体指针,指向一个名为stu结构体变量,则有如下对应关系:*sp=stu,(*sp).(成员名)=stu. (成员名)=sp->(成员名)

68、动态链表的特点------能够实现在程序运行的过程中开辟新的内存空间或者释放旧的内存空间;可以看作是由一条条链和一个个节点交替形成的链式结构,其中的节点就是结构体变量;后一节点的地址会存放在前一节点,则可以实现通过前一节点访问后一节点,这就是节点之间的关联,也就是节点的“链”。

69、关于exit()函数------exit()函数的作用是直接终止程序,一般情况下括号里放的是0,当程序执行到语句“exit(0);”时,程序就会终止执行。

70、动态链表的建立(思路)------1.先建立一个表头,作为链表的首节点,作用是标记链表的位置,表头一般不用来储存数据;2.利用malloc()函数建立新的节点,把节点的地址存在表头的链域;循环进行该步骤即可建立出任意长度的链表。

71、共同体变量------1.定义共同体变量与定义结构体变量的方式极其相似,此处不作赘述,详见P174;2.共同体变量的最大特点是能够自由更改变量的数据类型,我们可以把共同体变量理解成一个能够变换类型的变量。

72、typedef语句------作用是建立一个等效字符串,这个等效字符串能够代替某个类型说明符进行类型说明,简言之,typedef语句的作用是为某个类型说明符起别名;(例:执行语句“typedef int AA;”后,“AA”能够代替int对变量进行类型声明,如“AA x;”)

73、左移运算符<<:属于双目运算符,格式是“变量名<<操作数”,操作数决定了变量移位的位数,变量移位后在右侧补0

74、右移运算符>>:属于双目运算符,格式是“变量名>>操作数”,操作数决定了变量移位的位数,变量移位后,如果变量原来是负数则在最高位补1,否则补0

75、”字符串” 表示的是字符串的首地址,‟字符‟表示字符的ASCII码

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:年薪10万+的C/C++工程师需掌握哪些技能?
下一篇:学C++要学好C语言编程的四个知识点

C语言创建windows窗口实例

C++回调函数是什么?

C++ shared_ptr和动态数组

C语言有哪些关键词,C语言44个关键词大全

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

  • 搜索抖音号

    搜索抖音号:1821685962

    免费领取达内课程视频学习资料

Copyright © 2021 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省