C语言笔记9(函数的参数传递)(函数的递归调用)(局部变量)(全局变量)(变量的存储类型)(编译预处理)(宏定义)(终止宏定义)(文件包含)(条件编译)

 

 

 

函数的参数传递

形式参数:函数定义时的参数,简称形参。

实际参数:函数调用时的参数,简称实参。

实参与形参数目、类型和顺序应一致,占据不同存储单位。

 

 

理解单向值传递

每个函数都有自己的变量空间,参数也位于这个空间;

形参调用前不占内存单位,调用时对形参分配单位并传递实参的值。

调用结束后,形参单元被释放,实参单元仍保留并维持原值;

形参值的变化不会改变主调函数中实参的值,

 

 

一维数组做函数参数

实参、形参分别定义数组,名字可以相同,也可以不同;

调用时参数实现地址传递;

函数调用时实参用不带下标的数组名,必须有确切值;

形参数组和实参数组长度可以不相同,在调用时,只传送首地址而不检查形参数组的长度;

一维数组可以不指定大小;

对形参数数组的修改即是对实参数组的修改,函数无须返回数组。

 

 

二维数组做函数参数

函数定义中,形参数组定义可以省略第一维的大小,但是不能省略第二维的大小,因为必须知道列数才能正常计算一个·数组元素在数组中相对于第一个元素的偏移位置。

函数调用时,向函数二维数组的首地址。

函数的嵌套调用

嵌套调用:

在调用一个函数的过程中,又调用另一个函数。

C语言不能嵌套定义,但可以嵌套调用!

函数的递归调用

在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。

前者称为直接递归,后者称为间接递归。

 

 

用函数的参数传递求解问题的特点

纯在递归的终止条件;

存在导致问题求解的递归方式。

递归方法:递推、回归。

使用递归的优缺点

优点:

程序简洁,代码紧凑。

缺点:

每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息。所以递归次数过多,可能引起堆栈溢出,且时间效率较差。

变量的作用域和生存期

变量的作用域:是指变量在程序中作用范围。C语言中变量要先定义、后使用。但是定义语句应该放在程序的什么位置?在程序的什么范围可以访问所定义的变量?作用域与变量定义的位置有关。

变量的生存期:生存期与变量的存储类型密切相关。

 

 

局部变量的规则

局部变量不会默认初始化:

编译系统不为局部变量分配内存单元,只是当被调用时,分配零时单元,调用结束后,变量就消失了。

不同函数中可以定义同名变量,它们占据不同的内存单位:

在复合语句中定义的变量,只在本复合函数中有效;

在同一块内(函数或复合语句内)不能定义相同的变量;

main函数中定义的变量也是局部变量,只在main 函数中有效。 main 函数也不能使用其他函数定义的变量。

全局变量

全局变量(外部变量):

在函数外面定义的变量称为全局变量。

作用域:

全局变量具有全局的作用域和生存期,从定义的位置到本文件结束都可以使用。

全局变量规则:

若全局变量与局部变量同名,则在局部变量的作用范围内,同名的全局变量不起作用;

没赋初值的全局变量默认得到0值;

任何函数都可以使用全局变量。

优点:

函数建数据联系:

同一文件中的一些函数应用全局变量,当某个函数中改变了全局变量的值,其他函数中的全局变量值也随之改变。

函数可以得到多个返回值。利用全局变量的这个特性,可以在函数间传递数据。

缺点:

全局变量在程序的全部执行过程中都占用存储单位。

降低函数的通用性。

使用过多,降低程序的清晰性。

变量的存储类型

从变量值存在的时间(即生存期)看,变量的存储有两种不同的方式:静态存储和动态存储

静态存储:

在 程序运行期间由系统分配固定的存储空间;从程序开始执行到程序结束。

动态存储方式:

在程序运行期间根据需要进行动态的分配存储空间;

从包含该变量定义的函数开始执行至函数执行结束。

 

 

局部变量的存储方式(自变量、静态局部变量、寄存器变量)

1.自动变量(auto)

函数中的局部变量,不做任何存储类别的说明都为自动变量

定义形式:[auto] 类型说明符 变量名;

说明:

自动变量必需在一个函数体的内部,分配在动态存储区。

自动变量不赋初值,其值不确定。每调用一次,重新赋值一次。

函数的形参也是自动变量。

“自动”体现在进入语句块是自动申请内存,退出时自动释放内存;对他们分配和释放存储空间的工作有编译系统自动处理

2.静态局部变量(static)

有时希望函数中局部变量的值在函数调用结束后不消失(以后一直存在,并重视保持它的最新值,既具有记忆性),既不释放存储单元此时可指定该变量为"静态局部变量“。

定义形式:

static类型说明符 变量名;

静态局部变量的特性

静态局部变量系统自动初始化为0,存放在静态存储区;生存期为整个程序运行期间;

静态局部变量和全局变量都是静态存储类型,但作用域不同;

静态局部变量在编译时赋初值,每次调用时不再赋初值,只保留调用结束时变量的值,其值在整个程序运行期间都不释放。

3.寄存器变量(register)

对频繁对频繁使用的变量,为减少存取变量花费的时间,C语言允许将局部变量的值存放在CPU运算器的寄存器中,称为“寄存器变量”,用关键字“register"说明。

定义形式:register 类型说明符 变量;

说明:

寄存器变量的类型一般只限于整型、字符型或指向整型、字符型的指针,且只用于局部变量和形参。

全部变量、局部静态变量不可以作为寄存器变量。

不能定义任意多个寄存器变量,因为一个计算机系统中寄存器的数目是有限的。不能取寄存器变量的地址。

 

 

全局变量的存储方法(外部类型、静态类型)

1.外部全局变量

一个文件中要引用其他文件中定义的全局变量,应该在需要引用此变量的文件中用 extern int x;

2.静态局部变量

一个文件中的全局变量仅限于定义它的文件应用而不能被其他文件访问,需要用static 进行说明。

例:static int y;

说明:

外部全局变量与静态全局变量在同一文件内的作用域一样;

外部全局变量可以被多个文件引用,而静态全局变量仅在定义它的文件内有效,在程序的其他文件中不可使用。

内部函数和外部函数

函数本质上是全局的,因为一个函数要被另外的函数调用。但是,也可以指定函数不能被其他文件调用。

根据函数能否被其他原函数调用,将函数区分为内涵数和外部函数。

内部函数

内部函数的定义:

内部函数是只能被本文件中其他函数调用的函数,又称静态函数,函数的作用域仅限于本文件。

内部函数的定义格式

static int fun( int a, int b)

内部函数的作用

使用内部函数,可以使函数只局限于所在文件,如果在不同的文件中有同名的内部函数,互不干扰。

这样不同的人可以分别编写不同的函数,而不必担心所用函数是否会与其他文件中函数同名。

外部函数

定义:

外部函数是允许被其它文件调用的函数。

外部函数定义格式

[extern] int fun (int a, int b)

C语言规定,如果在定义函数时省略 extern。则隐含为外部函数。

外部函数使用说明

在需要调用此函数的文件,要用 extern声明所用函数式外部函数。

例:在源文件A中另一源文件B中的函数fun, 则需要在源文件A中对函数fun 进行说明,格式为:extern int fun( );

 

 

编译预处理

 

 

宏定义

宏定义的一般格式:

#define 宏名 字符串

功能:在预处理时,将程序中宏定义之后出现的所有的宏名,用宏替换字符串替换成字符串的过程。

例如:

#define PI 3.1415926

说明

宏定义通常放在程序开头,以#开头,不加分号;

宏名一般习惯用大写字母表示。

一个宏名只能被定义一次。

宏定义的作用域:

从定义开始到程序结尾。在进行宏定义时,可以引用已定义的其他宏名。

对在字符串常量及用户标识符中,与宏名相同部分不做替换。当宏定义在一行写不下,换行时需要在行尾加换行符“"。

 

 

 

终止宏定义

在程序中想终止宏定义的作用,可以使用终止宏定义命令。

终止宏定义格式:#undef 宏名

 

 

 

 

 

条件编译

通常情况下,源程序中所有的行都参加编译,C允许有选择编译的程序行。

条件编译

程序中的一部分内容在满足一定的条件下才能进行编译,即对一部分内容制定编译条件。

条件编译的作用

可有效的提高程序的可移植性,并广泛地应用商业软件中,为一个程序提供各种不同的版本。

 

posted @ 2024-01-27 16:50  ZDhr  阅读(330)  评论(0)    收藏  举报