上机运行以下程序注意注释的方法有哪些

2025年01月19日 阅读 (49)

第一部分 "C 语言基础知识"知识点

1、C 程序的基本结构 C程序是由函数构成的。每个程序由一个或多个函数组成,其中必须有且仅有一个主函数main。 main 函数是一个可执行 C 语言程序的入口和正常出口,而不论其在整个程序中书写的位置如何。 在 C 语言中,大小写字母是有区别的。。 C 程序的注释有两种方法,一种是行注释,使用"//";另外一种是块注释,使用"/* */",注意

"/*"与"*/"不能嵌套使用。 C 语言书写较为灵活,但是提倡采用缩进格式进行程序书写,以体现语句之间的层次感。 C 程序每条语句以"分号"作为结束标志。以下几种情况不得使用分号:

所定义的函数名称后不得使用分号; if…else…语句是一个整体,中间不能使用分号将其分隔开; 预编译命令后不能使用分号。

2、C 程序开发步骤

3、VC++6.0 开发工具的使用

按下功能键 Ctrl+F7 编译程序;按下功能键 F7 连接程序;按下功能键 Ctrl+F5 运行程序;若程序在编译和连接过程中有语法错误,则按下功能键 F4 定位错误所在行并根据错误提示信息改正错误。

4、C 语言中标识符的命名规则

标识符由字母、数字、下划线组成;规定第一个字符必须为字母或下划线。 标识符定义的变量名、函数名、常量名等最好做到"见名知义";大小写代表不同含义;不能使

用关键字;最好不要与 C 语言的库函数同名。

5、C 语言的数据类型

C 语言的数据类型由基本类型和复杂类型构成。其中基本数据类型包括字符型(char)、整型(int,short,long)、实型(float,double);复杂数据类型包括指针类型、数组、结构体、联合体。

char 型占 1 个字节、short 型占 2 个字节、long 型和 float 型占 4 个字节、double 型占 8 个字节。

6、常量

字符型常量 两种形式——普通字符、转义字符 不论普通字符,还是转义字符,都等价于 0-127 之间的某个整数,即 ASCII 码表。

整型常量 三种表示形式——十进制形式、八进制形式、十六进制形式 注意:C 语言的整型常量没有二进制表示形式。

实型常量 两种表现形式——小数表示形式、指数表示形式

字符串常量 编译系统会在字符串的最后添加''作为字符串的结束符。比较'a'和"a"的不同。

(5) 符号常量:例如 #define PI 3.14159

7、变量

变量必须"先定义、后使用"。变量代表计算机内存中一定大小的存储空间,具体代表多少字节的存

储空间示变量的类型而定,该存储空间中存放的数据就是变量的值。 注意:变量定义后如果未赋初值,则变量的初值是随机数。因此变量应该先赋值再使用才有意义。为

变量赋值的几种方法:①初始化;②赋值语句;③调用标准输入函数从键盘为变量赋值。 字符型变量

用"char"定义字符型变量,字符型变量存放 1 个字节的数值。对于无符号字符型变量,取值范围是 0~255,对于有符号字符型变量,取值范围是-128~+127。

(2) 整型变量 用"int"、"short"、"long"定义整型变量,其中 int 型和 long 型占用 4 个字节的存储空间,short型占用 2 个字节的存储空间。

(3) 实型变量 用"float"、"double"定义实型变量,其中 float 型占用 4 个字节的存储空间,double 型占用 8个字节的存储空间。

8、表达式

表达式具有广泛的含义,根据运算符不同,有赋值表达式、算术表达式、逻辑表达式、关系表达式等,甚至单独的一个常量或一个变量也是一个表达式。

9、运算符

算术运算符 除号——当除数和被除数都为整数时,相除的结果自动取整。 求余号——要求"%"号的两侧必须是整数,不能是实数。

赋值运算符 格式"变量 = 表达式",表示将表达式的值赋值到变量对应的存储空间里。 注意:赋值号"="的左侧必须是变量,不能是常量或者表达式。

复合赋值运算符 由算术运算符和赋值运算符组成,是两个运算符功能的组合。例如:a += a + c;

★ 自增、自减运算符表达式 当自增、自减运算符单独使用时放在变量前面或者后面没有区别。

例如:++i; 等价于 i++; 等价于 i=i+1; 自增、自减运算符与其它运算符共同存在于表达式中时,放在变量前和变量后有区别。

例如:若定义 int i = 3, j; 则 j = ++i; 语句执行后 i 的值为 4,j 的值为 4。 则 j = i++; 语句执行后 i 的值为 4,j 的值为 3。

关系运算符 注意:不能混淆赋值运算符和关系运算符中的等于号。前者是做赋值操作。

后者是判断两个数是否相等。

关系表达式的值只有"逻辑真"和"逻辑假"两种情况。

如果表达式的值为实型,不能使用"=="或者"!="判断两个值相等还是不相等。 逻辑运算符

运算逻辑表达式时,当参与运算的数"非 0 表示真"、"0 表示假";表达式的解"1 表示真"、"0 表示假"。

注意:"短路特性"的含义。如果逻辑与"&&"运算符左侧表达式的值为 0,则该运算符右侧的表达式被"短路",即运算过程被计算机省略掉;如果逻辑或"||"运算符左侧表达式的值为 1,则该运算符右侧的表达式被"短路"。

位运算符 只适用于字符型和整数型变量。是 C 语言具有低级语言能力的体现。 注意:不能混淆逻辑与运算符"&&"和按位与运算符"&";逻辑或运算符"||"和按位

或运算符"|";逻辑非运算符"!"和按位取反运算符"~"。 逗号运算符

功能为从左至右依次计算由逗号隔开的各表达式的值,最后一个表达式的值即为整个逗号

表达式的值。是优先级最低的运算符。 条件运算符

这是 C 语言中唯一的一个三目运算符,其形式为:表达式 1 ? 表达式 2 :表达式 3 求字节运算符 sizeof

注意:不能混淆求字节运算符 sizeof 和字符串长度库函数 strlen。前者是运算符,后者是函数。sizeof的值为 6,而 strlen的返回值为 5。

(11) 各种运算符混合运算时的优先级排队口决 二、 二、 二、 与、 或、 二、 逗 ! * / % + - = = == != && || = 。

数据类型的强制转换 格式:表达式。 注意:类型名两侧的小括号不能省略,表达式示情况而定可以增加小括号。

第二部分 "C 程序的三种基本结构"知识点

1、语句 C 语言的语句分为四类:①简单语句(分为表达式语句、函数调用语句);②空语句;③复合语句(由一对大括号括起来的一条或多条语句,复合语句在语法上视为一条语句);④控制语句(分为结构化语句。

如 if 语句、switch 语句、while 语句、do-while 语句、for 语句;非结构化语句,如 break 语句、continue语句、return 语句、goto 语句)。

2、程序的三种基本结构

顺序结构、选择结构、循环结构

3、顺序结构

printf函数的使用 难点

一般形式为:printf("格式控制字符串",输出项列表);

其中"格式控制字符串"包含三类字符——普通字符(即原模原样输出的字符,主要用于做

提示信息)、格式说明符(以"%"开头)、转义字符(以"/"开头) 输出项列表是可以省略的,当"格式控制字符串"中没有"格式说明符"时,输出项列表省

略;若是有"格式说明符"时,输出项列表不能省略,并且有几个格式说明符,输出项列表

就必须有几个对应数据类型的表达式,各表达式之间用逗号隔开。 需要掌握的格式说明符有:%c、%d、%f、%s、%u、%o、%x、%ld、%lf、%e、%%

scanf函数的使用 难点 一般形式为:scanf; 其中"格式控制字符串"包含两类字符——普通字符(需从键盘原模原样输入的字符,一般

起分隔和提示作用)、格式说明符 地址列表通常是不省略的,根据"格式控制字符串"中包含多少个格式说明符,地址列表中就有几个地址。对于普通变量,需在变量名前加上取地址符"&",数组名前不需加"&"。 注意 1:scanf函数的"格式控制字符串"中不能包含"转义字符",否则将引起输入无效。如 scanf ;是错误的。 注意 2:scanf的格式控制字符串中的普通字符不是用来显示的, 而是输入时要求照普通字符原模原样输入。 注意 3:scanf中参数的第二部分一定是地址列表,不能是表达式。 注意 4:字符和数值混合输入且二者中间没有分隔符,需注意何时加空格。例如:已定义

char x; int y; scanf("%c%d", 此时从键盘输入时,字符和整数之间需加空格; 而 scanf("%d%c", 此时从键盘输入时,整数和字符之间不能加空格。

getchar函数的使用 函数原型为:char getchar; 例如:char a; a=getchar; 该函数使用时关注函数的返回值。

putchar函数的使用 函数原型为:char putchar; 例如:putchar; 该函数使用时关注函数的参数。

printf、scanf、getchar、putchar这四个函数都属于标准输入输出库函数,调用时需在程序中包含头文件 stdio.h。

(6) 例如已定义:char a, b='A'; 则以下函数调用等价

4、选择结构

scanf; printf; 等价于 putchar;

if 语句 if 语句的三种形式——单分支选择结构、双分支选择结构、多分支选择结构。 单分支选择结构: if

注意:if 语句的表达式很多时候是关系表达式,不要将"=="号误用成"="号。 说明 1:表达式两侧的小括号不能省略,此表达式可以是 C 语言中任意合法的表达式,只

要表达式的值为非零,就执行其后的语句体;否则,结束 if 语句。 说明 2:由于"if"和"语句体"是一个整体,在语法上看作一条语句,因此在"(表

达式)"后面不能加";",如果加了分号,则 if 语句的语句体就成了空语句。 说明 3:"if(表达式)"会自动结合一条语句,如果语句体有多于一条语句时,必须使用复

合语句,即用大括号将多条语句括起来。

语句体;

易错点

易错点

说明 4:为了表示语句体从属于 if,书写时,应使语句体与关键字 if 的位置有缩进。 双分支选择结构(二选一):

说明 1:表达式只写在关键字 if 的后面,不能写在 else 的后面。 说明 2:"if"、"语句 1"、"else"、"语句 2"是一个整体,在语法上看作一条语句,因此在

"(表达式)"后面不能加分号,在关键字 else 后面也不能加分号。 说明 3:如果"语句体 1"、"语句体 2"有多于一条语句,则必须使用复合语句。 说明 4:书写时,应使关键字 if 和 else 对齐,"语句体 1"和 if 之间有缩进,"语句体 2"

和 else 之间有缩进。 多分支选择结构(多选一):

说明:表达式一定是跟在关键字"if"的后面,不能跟在关键字"else"的后面。

if(表达式) 语句体 1;

else 语句体 2;

if 语句体 1; else if 语句体 2; … else if 语句体 n; else 语句体 n+1;

switch 语句 switch { case 常量表达式 1: 语句 1; break; case 常量表达式 2: 语句 2; break; ……

case 常量表达式 n: 语句 n; break; 说明 1:关键字 switch 后面表达式的值必须是整型或者字符型,不能是实型。 说明 2:关键字 case 后面是"常量表达式",只能是常量或常量表达式,不能是变量或者变量

表达式。且表达式的值必须是整型或者字符型,不能是实型和字符串。书写时注意

"case"与"常量表达式"之间必须有空格;"常量表达式"后面是冒号。 说明 3:每个 case 分支后面的常量表达式必须互不相同。 说明 4:每一个分支后面的"break"可以省略,如果省略,则程序继续执行下一个 case 分支

的语句,否则执行完该 case 分支的语句就跳出 switch 语句。 说明 5:多个 case 分支可以共用一组语句,当某个 case 分支后面省略了语句,则意味着该分支

与它后面紧邻的分支共用语句。 说明 6:default 可以省略。 说明 7:书写时必须注意①switch 后面的表达式必须用小括号括起;②表达式的小括号后面不

能加分号;③case 和其后常量表达式之间必须加空格;④常量表达式以及 default 后面必须加冒号。

5、循环结构

循环结构程序编写过程中的三要素——循环的初始条件、循环的终止条件、控制循环结束条件的变化。

default : 语句 n+1; }

while(表达式) 循环体;

重点

(1) while 语句

while 语句构成的循环称为当型循环。当表达式的值为非零,则执行循环体,否则结束循环。 说明 1:表达式可以是 C 语言中任意合法的表达式,书写时不能省略其两侧的小括

号。 说明 2:"while(表达式)"会自动结合一条语句,如果循环体有多于一条语句时,必须使用复合

语句。 说明 3:"while(表达式)"与"循环体"是一个整体,"(表达式)"后面不应加分号,否则循环

体就成了一条空语句。 do-while 语句 do

循环体;

do-while 语句构成的循环称为直到型循环。先执行循环体,再判断表达式的值是否为非零,是则继续下一次循环,否则结束循环。 说明 1:do 必须和 while 联合使用。 说明 2:如果循环体有多于一条语句时,必须使用复合语句。 说明 3:表达式可以是 C 语言中任何合法的表达式,书写时其两侧的小括号不能省略,"while(表

达式)"后面的分号也不能省略。 for 语句

说明 1:小括号里有三个表达式,每个表达式之间用分号隔开。这三个表达式都可以缺省,但是应该在其它相应的位置补齐。

说明 2:"表达式 1"也称为初始表达式,在整个循环开始前执行一次;"表达式 2"也称终止表达式,每轮循环进入前执行一次,如果该表达式的值为非零,则执行循环体,否则结

束循环;"表达式 3"也称循环表达式,每次循环结束时执行一次,常用来控制循环的初始条件逐渐转变到终止条件。

说明 3:"for"会自动结合一条语句,当循环体有多于一条语句时,必须使用 复合语句。

(4) break 语句 break 语句出现在循环体中的作用是提前结束本层循环。 break 语句出现在 switch 语句中的作用是跳出本层 switch 语句。

(5) continue 语句 continue 语句只能出现在循环体中,其作用是提前结束本轮循环,进入下一轮循环。即当

continue 语句被执行时,放置在该语句之后的其它语句将被略过。注意:continue 语句并没有使整个循环结束。

6、常用算法、常用库函数

(1) 交换两个变量中存放的数值——使用首尾相接的三条语句。例如:已定义 int a=3, b=4, t; 若要交换 a 和 b 中的数值,使用如下三条语句 t = a; a = b; b = t;

数学函数——sqrt、fabs、pow、exp 斐波拉契数列 素数问题 N 项式求和问题 迭代法

while(表达式);

for循环体;

重点, 难点

难点 重点, 难点

第三部分 "数组、字符串"知识点

1、一维数组 一维数组的定义形式:类型说明符 数组名; 注意:方括号中的"常量表达式"表示该数组的元素个数。只能是常量,不能是变量或者变量表达式。 说明 1:数组一旦定义,就在内存空间中分配连续存放的若干存储单元,每一个存储单元的大小由数

据类型决定。例如有如下定义:int a; 则计算机为数组 a 连续分配 10 个存储单元,每个 存储单元占用 4 个字节,总共是 40 个字节的存储空间。

说明 2:数组一旦定义,数组名就代表了一段连续存储空间的首地址,数组名是常量,永远指向该数 组第一个元素的内存单元地址。

(2)一维数组元素的引用:数组名[下标] 与一般变量一样,数组必须先定义,后使用。数组元素的引用是指使用已定义数组中的某个指定元素。

通过"下标"来指定需要引用的元素。 注意 1:下标的下限一定是"0",上限由数组定义时的常量表达式值决定,为"常量表达式值-1"。

假设已经有如下定义:int a; 则引用该数组元素的下标范围是"0~9",若引用时下标超过此范围,称为数组越界,会导致程序运行出错。

注意 2:必须区分数组定义时方括号中的"常量表达式"和数组元素引用时方括号中的"下标",二者具有不同的含义和功能。前者是指明数组的大小,后者是指明要引用数组中的第几个元素。

(3)一维数组的初始化 与一般变量一样,数组定义后,如果没有为其赋初值,则数组元素中的初值是随机数。为数组元素赋

值的方法通常有两种:一种是进行初始化;一种是使用循环结构依次为每个数组元素赋值。 数组初始化的方法分为:①全部元素赋初值;②部分元素赋初值;③全部元素赋初值时可以不指定数

组长度。 一维数组元素的输入、输出 由于数组中的元素是若干个相同类型的数值,不能对其进行整体的输入或者输出,必须针对单个元素

进行输入或者输出,这时就要使用循环结构,对于一维数组来说,使用单层循环。

2、二维数组

二维数组的定义形式:类型说明符 数组名; 说明 1:"常量表达式 1"指明二维数组的行数,"常量表达式 2"指明二维数组的列数。 说明 2:二维数组可以看作特殊的一维数组,二维数组元素在内存中是"按行存放"。 二维数组元素的引用:数组名[列下标]

说明:与一维数组一样,二维数组元素引用时的行下标和列下标不能越界。假设已经有如下定义:int a; 则引用该数组元素时,行下标的范围是"0~2",列下标的范围是"0~3"。

二维数组的初始化 二维数组初始化有以下四种方式:①分行全部元素初始化;②分行部分元素初始

化;③按照数值存放顺序不分行初始化(使用一层花括号);④按照数值存放顺序不分行初始化,当对全

部元素赋初值时,可以省略确定行数的常量值。 二维数组元素的输入、输出 使用双层循环嵌套对二维数组的所有元素进行输入、输出。

3、字符数组与字符串

字符数组与字符串的关系 字符数组是字符型数据的集合。定义方式为:char 数组名; 与其它类型的数组一样,将

数组中的各个字符看作是独立的个体。当这些字符中有''时,可以将它们视为一个整体,即字符串。 字符串有常量,但是没有字符串型的变量,字符串常量使用字符数组进行存放,前提是字符数组的大

小要能容纳整个字符串,包括字符串的结束符''。 字符数组的初始化 当字符数组中存放的所有字符作为独立个体时,其初始化方法与其它类型的数组一样。当字符数组中

存放的是字符串时,其初始化方法有如下几种: ① char a = {'H', 'e', 'l', 'l', 'o', ''}; ② char a = {"Hello"}; ③ char a = "Hello"; ④ char a = "Hello"; 向字符数组中存放字符串的方法 定义了字符数组后,如果要向数组中存放字符串,除了以上提到的初始化方法,还有以下方法,注意

不能使用赋值语句的方法。假设已经有定义:char a; 方法 1:scanf; 注意:a 已经代表数组的首地址,前面不再有取地址符 方法 3: int i=0;

while) != '') i++; a = '';

重点 注意:不能用赋值语句的方法向字符数组中存放字符串。以下写法是错误的,原因是数组名是常量, 永远指向数组的首地址,字符串常量书写时,系统给出其在内存中占用的一段无名存储区的首 地址,不允许将数组名这个常量重新赋值指向另一个地址空间。

char a; a = "Hello"; ''何时系统自动添加、何时需手动添加 字符串常量的结束标志是'',缺少了'',则不能称为字符串常量。以下列出何时由系统自动添加''。

何时需要编程者自己手动添加''的几种情况。 系统自动添加的情况: 调用 scanf 函数从键盘输入字符串时。例如:scanf; 调用 gets 函数从键盘输入字符串时。例如:gets; 以字符串常量形式对字符数组进行初始化时。例如:char a = "Hello"; 调用 strcpy 函数将字符串拷贝到字符数组中时。例如:strcpy;

需手动添加''的情况: 以字符形式对字符数组进行初始化时。例如:char a = {'H', 'e', 'l', 'l', 'o', ''}; 先定义字符数组,再将单个字符赋值到各个数组元素中时。例如:char a;

a='H'; a='e'; a='l'; a='l'; a='l'; a=''; 对字符数组中原来存放的字符串进行处理,破坏了原字符串的'',对新处理后的字符串需手动添加''

(5)字符串输入、输出 第一种方法:调用 scanf、printf 函数实现,格式说明符使用"%s"。例如:

char a; scanf; //当遇到空格或者回车时系统认为字符串输入结束 printf; //字符串输出

第二种方法:调用 gets、puts 函数实现。例如: char a; gets; //当遇到回车时系统认为字符串输入结束

puts(a); 说明:scanf 和 gets 输入字符串时的区别是——scanf 不接收空格,该函数认为空格是字符串输入结束

标志。而 gets 接收空格作为字符串中的有效字符,该函数只认为回车是字符串输入结束标志。 字符串处理函数 求字符串长度函数:strlen

例如:char s; int len; len = strlen; 说明 1:使用 strlen 求字符串长度时,计算的是第一个''之前的有效字符个数,函数返回值不包

括''占用的字节数。 说明 2:注意区分 strlen 和 sizeof。首先,strlen 是库函数,而 sizeof 是运算符;其次,strlen 计

算的是字符串有效字符占用的字节数,不包括''占用的空间,而 sizeof 计算的是字符 数组或者字符串占用内存的字节数,包括''占用的空间。例如:

char s="Hello"; int x, y, m, n; x = strlen; y = sizeof; m = strlen; n = sizeof; 以上举例中,变量 x 和 m 的值都是 5,因为 strlen 函数仅仅统计字符串中有效字符的占 用的字节数。变量 y 的值是 20,因为 sizeof计算的是数组 a 在内存中占用的字节数。 变量 n 的值是 6,因为 sizeof计算的是字符串"Hello"在内存中占用的字节数, 包括''占用的空间。

字符串连接函数:strcat 例如:char s1 = "Hello", s2 = " every one";

strcat; //表示把字符串" every one"粘贴到字符串"Hello"的后面 strcpy;

字符串比较函数:strcmp 说明:该函数是从左至右依次将两个字符串的对应字符取出做比较,比的是对应字符 ASCII 码

值的大小。当字符串 s1 大于字符串 s2 时,函数返回 1;当字符串 s1 等于 s2 时,函数返 回 0;当字符串 s1 小于 s2 时,函数返回-1。

字符串拷贝函数:strcpy 说明:该函数将 s2 指向的字符串拷贝到 s1 指向的存储空间里,要求 s1 指向的存储空间必须足够

大,能够容纳即将拷贝的字符串。 例如: char s1, s2 = "Hello";

strcpy; //表示把字符数组 s2 中存放的字符串拷贝到字符数组 s1 中 strcpy; //表示把字符串"China"拷贝到字符数组 a 中

4、常用算法

冒泡法排序 选择法排序

重点

重点

第四部分 "函数"知识点

1、库函数与自定义函数

(1) 库函数:目前已学习过的库函数有标准输入输出类库函数、数学类库函数,当程序中调用库函数时,必须包含对应的头文件。例如标准输入输出类库函数对应的头文件是stdio.h,数学类库

函数对应的头文件是math.h。 用户自定义函数:用户自己编写的完成特定功能的函数,也称子函数。 一个 C 程序由一个 main 函数和若干多个子函数组成。

2、函数定义、函数调用、函数声明的概念

函数定义——即定义函数的功能。未经定义的函数不能使用。 函数调用——即执行一个函数,调用函数时,程序跳转到被调用函数的第一句开始执行,执行

至被调用函数的最后一句,然后程序返回调用该函数处。 函数说明——即通知编译系统该函数已经定义过了。

3、函数定义的格式

函数类型 函数名 {

重点 函数首部

函数体语句 } 函数由函数首部和函数体构成,其中函数首部由函数类型、函数名、参数表组成。 关于函数类型的说明 说明 1:函数类型分为"空类型"和"非空类型(需指定具体的返回类型,如 int。

float、double、char、指针类型、结构体类型等)"。 说明 2:当缺省"函数类型"时,默认函数返回类型为 int 型。 说明 3:当函数类型是"非空类型"时,函数体内必须有 return 语句,写成"return(表达式);"。

表达式值的类型必须与函数类型一致,否则编译系统会给出警告提示。 说明 4:当函数类型是"void"时,函数体内不需要 return 语句,或者直接写"return ;"即可。 说明 5:函数类型是 C 语言中的关键字,在 VC++6.0 编译环境中是蓝色字体。 关于函数名的说明 说明 1:函数名命名必须符合 C 语言标识符的命名规则。命名函数名最好是见名知意。 说明 2:同一段程序中的各自定义函数不允许函数名同名。 关于参数表的说明

说明 1:此时参数表中的参数称为形式参数,简称"形参"。形参必须用一对小括号括起来。 说明 2:如果参数表中没有参数,称为无参函数,此时小括号中可以写关键字 void,或者什么都

不写。 说明 3:如果参数表中有参数,称为有参函数,此时小括号中必须明确申明各个参数的数据类型。

注意:每个参数都必须有各自的类型说明符,如 int fun 关于函数体的说明

说明 1:函数体必须用一对大括号括起来,函数体前面是说明部分,后面是执行语句部分。 说明 2:函数首部与函数体是一个整体,不能被分离开。例如,在括起参数表的小括号与括起函数

体的大括号之间加上分号是错误的。

4、函数调用

一个已经定义的函数,只有在发生函数调用时才能被执行。函数调用的过程即是程序跳转到被调用函

数的第一句开始执行,执行至被调用函数的最后一句,然后程序返回函数调用语句处。 函数调用的一般形式: 有参数函数的调用形式: 函数名 无参数函数的调用形式: 函数名

函数的传值调用 函数调用时的参数称为实际参数,简称"实参"。当发生函数调用时,实参将数值传递给形参。

实现函数调用时的数值传递。 为保证函数调用时正确的数值传递,"实参"与"形参"应有严格的对应关系,可以归纳为"3

个一致和 1 个不一致"——规定:实参的个数、类型、顺序必须与被调用函数形参的个数、类型、顺序保持一致。而实参与形参的参数名称可以不相同。 C 语言中函数调用的三种方式

作为独立的语句。例如:printf; 作为表达式中的一部分。例如:y = sqrt; 作为其它函数的实参。例如:printf;

5、函数声明

类型名 函数名; 说明:函数声明、函数定义、函数调用三者必须有严格的对应关系,三者的函数类型需一致,函数名

需相同,参数的个数、类型、顺序需一致。

6、函数的嵌套调用

C语言中不允许作嵌套的函数定义。因此各函数之

间是平行的,不存在上一级函数和下一级函数的问题。 但是C语言允许在一个函数的定义中出现对另一个函

数的调用。这样就出现了函数的嵌套调用。即在被调函

数中又调用其它函数。 其关系如图所示:在执行 main 函数的过程中调用

f1 函数,于是转去执行 f1 函数,在执行 f1 函数过程中又调用 f2 函数,于是转去执行 f2 函数,f2 函数执行完毕后返回 f1 函数的断点继续执行,f1 函数执行完毕后返回 main 函数的断点继续执行。

7、变量的作用域和存储类别

变量的作用域是指从空间上对变量的作用范围进行分类,分为全局变量和局部变量。其中全局变量的

作用范围宽,局部变量的作用范围窄。 变量的存储类别是指从时间上对变量的存在时间长短进行分类,分为动态变量、静态变量。其中动态

变量的存在时间短,静态变量的存在时间长。

(1)变量的作用域 变量的作用域是指变量的作用范围,分为全局变量和局部变量,局部变量又分为函数体的局部变量以

及复合语句的局部变量。

全局变量 函数体内的局部变量 复合语句内的局部变量 定义位置 定义在函数体外面 定义在函数体内部 定义在复合语句内部

作用域 从定义位置开始到整个.c 文件结束有效

本函数体内有效 本复合语句内有效

注意事项 同一个.c 文件内的全局变量不能重名

(1)必须写在执行语句之前(2)同一函数体内的局部变

(1)必须写在执行语句之前(2)同一个复合语句内的局

重点

(2)全局变量允许与局部变量重名,重名时,局部变量

屏蔽全局变量

量不能重名 (3)当与全局变量重名时,局部变量屏蔽全局变量

部变量不能重名 (3)与前两种变量相比,这是作用范围最小的一种变量

说明 1:从此表格可以看出,作用范围最宽的是全局变量,其次为函数体内的局部变量,范围最窄的是复合语句内的局部变量。

说明 2:当全局变量、局部变量有重名时,范围较窄的变量会自动屏蔽范围较宽的变量。 说明 3:定义在函数体内的变量以及形参都属于局部变量。 变量的存储类别 变量的存储类别分为 auto、static、register、extern。 动态变量—— 只在某一个时间段内存在。例如函数的形参、函数体内的局部动态变量,这类变

量在发生函数调用时,系统临时为它们分配存储空间,但是随着函数调用结束, 这些变量的存储空间被释放掉,变量的值也随之消失。 动态变量分为全局动态变量、局部动态变量。

静态变量—— 生存期为程序的整个执行过程,直到程序运行结束。这类变量一旦定义,系统就 为之分配存储空间,静态变量在整个程序运行过程中固定的占用这些存储空间, 因此也称永久存储。

静态变量分为全局静态变量、局部静态变量。 注意:静态变量定义后如果没有赋初值,则初值为零。这一点与动态变量不同, 动态变量定义后如果没有赋初值,则初值是随机数。

寄存器变量—— 可以将使用频率较高的变量定义为 register 型,以提高程序的运行速度。寄存 器变量属动态变量,存储空间到特定时候就自动释放。 注意:寄存器变量只限整型、字符型、指针型。

外部变量—— 如果在某个源文件中定义了一个全局动态变量 int x,在另外一个源

auto

static

register

extern

重点

重点

文件中需要引用这个全局变量 x,则在"b.c"中对变量 x 进行如下说 明"extern int a;"后,即可引用"a.c"中定义的变量 x。 注意:全局变量的定义只能有一次,但是使用 extern 对其进行说明可以有多次。 这一点与函数类似,函数定义也是只能有一次,而函数说明可以有多次。

8、函数的存储分类

(1)用 static 说明函数 一个函数定义后,除了被所在的源文件调用,不允许被其它的源文件调用,则在函数首部的返回值

类型前面加上 static 关键字即可达到以上目的。这样做的好处是避免不同的.c 文件定义了同名的函数而引起混乱。

(2)用 extern 说明函数 一个函数定义后,如果除了被所在的源文件调用,还能被其它源文件调用,则其它源文件在调用该函

数前,需先使用 extern 关键字进行说明,之后便可调用。

9、编译预处理

在 C 语言中,凡是以"define"和"#include"。注意:每行的末尾不能加";"号。

(1) 宏替换 —— #define 不带参数的宏定义

#define 宏名 替换文本 使用说明:替换文本中可以包含已经定义过的宏名 书写说明:当宏定义分多行书写时,在行末加一个反斜线"";宏名习惯用大写字母;宏定义一般写在程序的开头。 带参数的宏定义

#define 宏名 替换文本 使用说明 1:参数表中只有参数名称,没有类型说明。 使用说明 2:如果替换文本中有括号,则进行宏替换时必须有括号;反之,如果替换

文件中本身没有括号,则宏替换时不能随便加括号。 书写说明:宏名和小括号必须紧挨着;小括号不能省略;

重点

(2)文件包含 —— include 命令行的形式如下: include 文件名 如果文件名用双引号括起来,是指系统先在源程序所在的目录查找指定的包含文件,如果找不到,再

按照系统指定的标准方式到有关目录中去找。 如果文件名用尖括号括起来,系统将直接按照系统指定的标准方式到有关目录中去寻找。

第五部分 "指针"知识点

1、指针的基本概念 计算机的内存空间是由许多存储单元构成的,每个存储单元代表一个字节的容量,每个存储单

元都有一个唯一的编号,即地址。程序运行过程中使用变量等就存放在这些存储单元中。对变量的取值有

两种方法,一种是使用变量名对其内容进行存取,称为"直接法",另一种是借助变量的地址对其内容进

行存取,称为"间接法"。 指针──即地址。一个变量的地址称为该变量的指针,通过变量的指针能够找到该变量。 指针变量──专门用于存储其它变量地址的变量。指针与指针变量的区别,就是变量值与变量名的区

别。注意:指针变量存放的是地址值,而不是通常意义上的数值。

2、指针变量的定义、赋值

(1)指针变量的定义: 类型标识符 *指针变量名; 说明 1:此处的类型标识符称为指针变量的"基类型",即表示该指针变量应存放何种类型的变量地

址,指针变量的基类型必须与其指向的普通变量同类型,否则会引起程序运行错误。 说明 2:与普通变量的定义相比,除变量名前多了一个星号"*"外,其余一样。注意:此时的星号

仅仅是一个标识符,标识其后的变量是指针变量,而非普通变量。 说明 3:例如有定义"int *p;"表示定义了一个 int 类型的指针变量 p,此时该指针变量并未指向某个

具体的变量(称指针是悬空的)。使用悬空指针很容易破坏系统,导致系统瘫痪。 重点

重点及难点

说明 4:不论是什么类型的指针变量,在 VC++6.0 编译环境中已定义的指针变量都占用 4 个字节的存储空间,用来存放地址。这点与普通变量不一样,普通变量根据不同的数据类型,它所占用

的存储空间字节数是有差别的。 指针变量的赋值 与普通变量相同,指针变量可以在定义时为其赋值,称为初始化;也可以先定义,再使用赋值语句为

其赋值,赋值方式为:指针变量名=某一地址; 通常有以下几种方法为指针变量赋值:

方法一:指针变量名 = //以下两种写法均能实现为指针变量 p 动态分配 40 个字节存储空间的功能 p = malloc); 等价于 p = calloc);

3、指针运算

指针运算中两个重要的运算符 * : 取出其后内存单元中的内容。 &: 取出其后变量的内存单元地址。 说明:此处的取内容符也是星号,外形上与指针变量定义时的标识符一样,但是二者的含义完

全不相同,前者是运算符,后者只是一个标识符。 (2)移动指针

重点

重点

移动指针就是对指针变量加上或减去一个整数,或通过赋值运算,使指针变量指向相邻的存储单元。

只有当指针指向一串连续的存储单元时,指针的移动才有意义。 指针移动通过算术运算来实现,指针移动的字节数与指针的基础类型密不可分。例如已定

义:char *p1; int *p2;进行如下运算"p1++; p2++;"后,指针 p1 中存放的地址值自增一个单元,指针 p2 中存放的地址值自增 4 个单元。

比较运算 比较运算是比两个指针变量中存放的地址值的大小关系。 指针的混合运算 例如有定义:int a, *p; 则以下一些举例的混合运算需要仔细推敲其含义。

难点

①"&*p"的含意是什么?②"*&a"的含义是什么?③"(*p)++"的含义是什么?④"*p++"的含义是什么?⑤"*++p"的含义是什么?⑥ "++*p"的含义是什么?

4、函数之间地址值的传递

(1)实参向形参传送地址值 如果函数的形参为指针变量,对应的实参必须是基类型相同的地址值或者是已指向某个存储单元的指

针变量。 教材 7.5 节的内容是"函数之间数值的传递",这种方式下完成的是实参向形参的数值单向传递,即

当发生函数调用时,实参将其数值传递给形参,函数调用完毕后,形参的改变并不能影响对应实参的值。

因此把这种数值传递称为是"单向"的。 而本节的内容是"函数之间地址值的传递",其特点是实参为主调用函数中某内存单元的地址,在被

调用函数中可以通过形参对主调函数中该内存单元的值进行修改,这也就使得通过形参改变对应的实参值

有了可能,因此通过地址值的传递方式,主调函数与被调函数之间数据传递可以实现"双向"的传递。 "传地址"方式的体现的另外一个优越之处在于:可以将多个数据从被调函数返回到主调函数中。这

一点也是"传值"方式做不到的,传值方式中被调函数只能利用 return 语句向主调函数返回一个数据。 同学需仔细区分函数之间"传值"与"传地址"这两种方式各自的特点,做题时注意分析何时为传值

方式,何时为传地址方式。 通过 return 语句返回地址值 当函数返回值的类型是指针类型,而非普通数据类型时,表明被调函数调用完毕后向主调函数返回的

是一个地址值,而不是一个普通的数值。此时应注意 return 语句的表达式值应是指针类型(地址值)。

重点

重点

5、一维数组和指针

数组名是一个地址常量 使用指针对数组元素进行访问是基于数组元素顺序存放的特性。

方式一:利用数组的首地址(数组名)访问数组元素。注意:由于数组名是常量,因此对数 组名不能使用自增运算,必须借助一个变量 i 来实现对数组元素的顺序访问。

例如: int a, i = 0; while scanf; 方式二:利用指针变量访问数组元素。 例如: int a, i = 0, *p = a; while scanf;

引用一维数组元素的二种等价方法——下标法、指针法 假设有如下定义:int a, *p = a; 从上表可总结出,下标法取数组元素数值的表达式为"a"或"p",指针法取数组元素数值

的方法为"*(a+i)"或"*(p+i)"。下标法取数组元素地址的表达式为"&a[i]"或"&p[i]",指针法取数组元素地址的方法为"a+i"或"p+i"。

假设有以下定义:int a, *p = a; 则 p 和 a 的相同点是:都是指针,存放数组的首地址。 不同点是:a 是地址常量,p 是指针变量。a 永远指向该数组的首地址,直到该数组

的存储空间被系统收回;p 是变量,可以重新赋值指向其它的存储空间。

6、一维数组与函数参数

数组元素作为函数实参 由于数组元素相当于一个个独立的普通变量,当数组元素作为函数实参时,实现的是"传值"方式,即单向传递。在被调函数中只能使用数组元素的数值,不能改变数组元素的初值。 数组元素的地址作为函数实参

当某数组元素的地址作为函数实参时,实现的是"传地址"方式,能够达到双向数据传递的功能。即在被调用函数中,不但可以利用形参使用该数组元素的初值,还可以达到修改该数组元素初值

的目的。 (3)数组名作为函数实参

当数组名作为函数实参时,由于数组名本身就是一个地址值,因此实现的是"传地址"方式,能够达到双向数据传递的功能,对应的形参必须是一个与数组类型一样的指针变量。在被调用函数中。

可以通过形参(指针变量)使用数组中的所有元素,还能够修改这些元素的初值。 说明 1:数组名作为函数实参时,对应的形参有如下几种写法,都代表一个与数组类型一致的指

针变量。 void fun 或者 void fun 或者 void fun { … } { … } { … }

说明 2:数组名作为实参时,对应的形参是一个与数组同类型的指针变量,发生函数调用时,系 统只是为该指针变量分配 4 个字节的存储空间,并不是分配等同于整个数组需要 占用的存储容量。 例如:

a a a 下标法

p p p *a * *

取数

组元

素的

数值 指针法

*p * *

&a &a &a

下标法 &p &p &p

a a+1 a+2

取数

组元

素的

地址指针法

p p+1 p+2

重点

重点

void main void fun{ { int a; … … printf); printf); …

fun(a); } …

注:fun 函数中的打印结果是"4",因为形参是一个指针变量,不论何种类型的指针变量,系统都为它分配 4 个字节的存储空间。

}

注:主函数中的打印结果是"40",因为 a 数组定义后,系统为它分配 40 个字节的存储空间。

7、二维数组和指针 难点

二维数组"基类型"的理解 假设有定义:int a, *p;

与一维数组一样,二维数组名也是一个地址常量。 二维数组可以看作由多个一维数组组成,由以上定义可知,二维数组 a 由三个一维数组组成,每

一个一维数组中有四个元素,a[0]、a[1]、a[2]分别是这三个一维数组的数组名,它们各自代表了这三个一维数组的首地址,同样也是不可改变的常量地址。

基于以上分析,可以这样理解:①二维数组名 a 的基类型是 4 个 int 型;②一维数组名 a、a、a的基类型是 1 个 int 型。 假设有定义:int a={1, 2, 3, 4, 5, 6, 7, 8, 9 10, 11, 12};以下示意图表示了二维数组名、一维数组名、二维数组中各元素之间的对应关系。

郑重声明:玄微运势的内容来自于对中国传统文化的解读,对于未来的预测仅供参考。