1.函数的定义
为了使程序大而不繁,简单明了,程序设计者要根据软件的总体要求,把相同的功能或相似的操作归纳成模块的形式,并设计成函数,以实现程序设计的结构化。2.函数定义的一般格式
类型标识符 函数名([参数表列]){
[声明部分]
语句
}
调用后续声明的函数时,必须在调用之前先进行声明
函数的定义与声明例:
1.先定义,后使用
#include "stdafx.h"
void show(char p[])
{
printf("%s",p);
}
int _tmain(int argc, _TCHAR* argv[])
{
char p[]=" ddddd";
show(p);
return 0;
}
void show(char p[])
{
printf("%s",p);
}
2.main函数在前,定义在后,须在main函数中调用
void show(char p[])
{
printf("%s",p);
}
int _tmain(int argc, _TCHAR* argv[])
{
char p[]=" ddddd";
show(p);
return 0;
}
void show(char p[])
{
printf("%s",p);
}
例:定义一个函数,用于求数中的最大数。
#include "stdafx.h"
int max(int n1,int n2)
{
return(n1>n2?n1:n2);
}
int main() //在可以省略类型类型标识符,一般不建议使用。
{
int max(int n1,int n2);
int num1,num2;
printf("input two numbers:\n");
scanf("%d%d",&num1,&num2);
printf("max=%d\n",max(num1,num2));
return 0;
}
3.函数的参数与返回值
3.1函数的返回值
3.1.1函数的值只能通过return语句返回主调函数,当遇到return时,方法执行将终止3.1.2一个函数最多可以返回一个值,不能返回多个值;不返回函数值的函数,可以明确定义为“空类型”,类型说明符为“void”。
3.1.3返回值的数据类型必须与函数声明时返回值的数据类型匹配。如果两者不一致,则以函数类型为准,自动进行类型转换。
3.1.4如函数值为整型,在函数定义时可以省去类型说明。
3.2函数的参数
形式参数:形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。
实际参数:实参出现在主调函数中,进入被调函数后,实参变量也不能使用。
注意:1)形参和实参的功能是作数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。
2)形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。
3)实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。
4)实参和形参在数量上、类型上、顺序上应严格一致,否则会发生“类型不匹配”的错误。
5)函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
4.函数调用方式
C语言中函数的调用一般形式为:函数名([实际参数列表])1)函数表达式:函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。例如:c=add(a+b);
2)函数语句:函数调用的一般形式加上分号即构成函数语句。例如: printf("%d",a)
3)函数实参:函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实 参进行传送, 因此要求该函数必须是有返回值的 。 例如:d=add(a,add(b,c));
调用说明(函数的调用时应注意)
1)函数名称必须与具有该功能的自定义函数名称完全一致2)实参在数量、类型、顺序上应严格和形参一一匹配
3)函数调用也是一种表达式,其值是函数的返回值
4)被调函数可以是自定义函数,也可以是系统函数,还可以调用自身
5)被调函数中还可以调用函数
6)调用后续声明的函数时,必须在调用之前先进行声明
递归函数的使用:
l
递归是一种方法(函数)调用自己的编程技术,它在定义自身的同时又出现了对自身的引用,有点类似于我们高中学的的
数学归纳法
。用递归的目的在于解决一种常见问题,即子任务不过是开始试图解决的相同问题的一个较简单版本
。
注意:l
发现逻辑“相似性”
不要忘记递归出口
局部变量:局部变量也称为内部变量
1.在
函数内作定义说明的
。
2.随函数
的调用而生成,随函数调用结束而释放
3.作用域
仅
限于定义它的函数
内
,离开
该函数后再使用这种变量是非法的
。
全局变量:全局变量也称为外部变量
1.它
是在函数外部定义的变量
。
2.它
不属于哪一个函数,它
属于一
个源程序文件
。
3.其
作用域
是从定义变量的位置开始到所在源程序文件结束。
4.在
函数中使用全局变量,一般应作全局变量说明
。只有
在函数内经过说明的全局变量才能使用。全局变量的说明符
为
extern
。但
在函数之前
定义的全局变量,在该函数内使用可不再加以说明。
变量的存储类别:
1.从
变量值存在
的生存期来
分,可以分为静态存储
方式和
动态存储方式。
1.1静态存储方式:是指在程序运行期间分配固定的存储空间的方式。
1.2动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式
。
2.C
语言中,具体的存储类别有自动、寄存器、静态及外部四种
2.1自动存储类型(
auto
):
具有
动态性,随函数调用而生成,随调用结束而释放;局部变量默认
2.2寄存器存储类型(
register
):大量重复调用时,提高执行效率;仅限于定义它的函数
2.3外部存储类型(
extern
):
多
个程序文件之间进行变量调用;不是变量定义,扩展变量作用域
2.4静态存储
类型(
static
):存储在固定的内存单元,直到程序运行结束才释放
常用系统函数:
终端与环境变量
getopt
()
分析命令参数
ttyname
()
获取终端机名称
日期时间函数
<
time.h
>
time()
获取当前时间
ctime
()
获取字符串格式的日期时间
gmtime
()
获取当前日期和时间
difftime
()
计算时间差
字符串处理
<
string.h
>
index()
查找字符串中第一个字符出现的位置
strcat
()
拼接字符串
strcmp
()
比较字符串
strcpy
()
复制字符串
数学函数
<
math.h
>
abs()
绝对值
cos
()
余弦
ceil()
不小于参数的最小整数
exp
()
指数
sqrt
()
开平方
数据结构与算法
crypt()
将数据或密码加密
bsearch
()
二元搜索
lfind
()
线性搜索
lsearch
()
线性搜索
rand()
产生随机数
srand
()
设置随机数种子