admin 管理员组

文章数量: 887019


2024年2月23日发(作者:dz论坛插件目录)

C 语言入门必须掌握的 75个知识点

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

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

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

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 ,是其中一种强制转换运算符。 (intx+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 码


本文标签: 变量 函数 结构 进行