今天是发博第二周,也是系统性学习C的第二周,奖励自己肝多几页c primer plus😍
定义带形式参数的函数
函数定义从下面的ANSI C风格的函数头开始:
void show_n_char(char ch, int num)
- 分析:该行告诉编译器show_n_char()使用两个参数ch和num,且ch是char类型,num是int类型。像这样的两个变量被称为形式参数,简称形参。和定义在函数中的变量一样,形式参数也是局部变量,为该函数私有,也就是说在其他函数中使用同名变量不会引起名称冲突。每次调用函数都会给这些变量赋值。
- 注意:ANSI C要求在每个变量前都声明其类型。也就是说,不能像普通变量声明一样使用同一类型变量列表,例如:
void dibs (int x,y,z) /*无效的函数头*/
void dibs (int x,int y,int z)/*有效*/
虽然show_n_char()接受来自main()的值,但是它没有返回值。因此,show_n_char()的类型是void
声明带形式参数函数的原型
在使用函数之前,要先用ANSI C形式声明函数原型,例如
void show_n_char(char ch, int num);
当函数接受参数时,函数原型用逗号分隔开的列表指明参数的数量和类型。根据个人喜好,你也可以省略变量名:
void show_n_char(char,int)
在原型中使用变量名并没有实际创建变量,char仅代表了一个char类型的变量,以此类推。
调用带实际参数的函数
在函数调用中,实际参数(简称实参)提供了ch和num的值。
show_n_char(SPACE,12);
实际参数是空格符号(#define SPACE ' ')和12。这两个值被赋给show_n_char()中的相应的形式参数:变量ch和num。简而言之,形式参数是被调函数中的变量,实际参数是主调函数赋给被调函数的具体值。如上列所示,实际参数可以是常量、变量,甚至是更复杂的表达式。无论实际参数是何种形式都要被求值,然后该值被拷贝给被调函数相应的形式参数。例如:
show_n_char(SPACE, (WIDTH - strlen(PALCE))/2
构成该函数的第2个实际参数是一个很长的表达式,对高表达式求值为10。然后10被赋给变量num。
强调:实际参数是具体的值,该值要被赋给作为形式参数的变量(如下图)。
因为被调函数使用的值是从主调函数中拷贝而来,所以无论被调函数对拷贝数据进行什么操作,都不会影响主调函数中的原始数据
黑盒视角
- 从黑盒的视角看 show_n_char(),待显示的字符 和显示的次数是输入。执行后的结果是打印指定数量的字符。输入以参数的形式被传递给函数。这些信息清楚地表明了如何在main()中使用该函数。而且,这也可以作为编写该函数的设计说明。
- 黑盒方法的核心部分是:ch、num和count都是show_n_char()私有的局部变量。如果在main()中使用同名变量,那么它们相互独立,互不影响。也就是说,如果main()有一个count变量,那么改变它的值不会改变show_n_char()中的count,反之亦然。黑盒里发生了什么对主调函数是不可见的。
欧克,就这样了,明天还有英语考试,
晚睡早起身体好
That's all