C-函数
1.C的设计原则是把函数作为程序的构成模块。
2.函数是完成特定任务的程序代码的自包含单元。函数一般有两个功能,执行某些动作;返回一个值以供调用程序使用。
3.使用函数的好处,代码重复利用;是程序更加模块化。
4.通常把函数看作黑盒子,对于一定的输入会产生特定的结果,而不用考虑内部实现,除非是函数的编写者。这样看待函数有助于把精力放在程序整体设计而不是具体实现细节。
5.编写函数需考虑函数要的功能和函数与程序整体上的关系。
6.函数的声明(ANCI C函数原型),告诉编译器函数的类型,且需要在其他地方找到该函数的定义。
函数的定义,函数的具体实现,确切的指定了函数的具体功能。
函数的调用,导致该函数被执行。
函数必须先声明后使用。函数定义在调用之前,可不声明,函数定义在调用之后或在其他文件中,那么调用之前必须先声明。被调用函数声明可在调用函数之外,也可在调用函数内任何可以放置变量声明的位置。
7.函数声明(ANCI C函数原型)
返回值类型 函数名(形参类型1 参数名1,形参类型2 参数名2);)(声明了函数名,函数返回值类型,函数参数个数和类型)
返回值类型 函数名(形参类型1,形参类型2);(省略参数名)
int prinf(char *, ...);//不确定参数函数的声明
void aaa(void);//无参数无返回值函数的声明
int bbb(int m, int n);
int bbb(int, int);
旧式函数声明:
void aaa();
int bbb();(只需要声明函数返回值类型,不需要参数信息)
ANCI C函数原型的好处,通知编译器更多信息,使其在编译函数调用语句时能检查更多错误。
8.函数定义
返回值类型 函数名(形参类型1 参数名1,形参类型2 参数名2)//函数头
{
//函数体
}
int bbb(int m, int n)
{
//函数体
}
形式参量(形参)和定义在函数内部的变量一样,是局部变量,是函数私有的。即时在函数外部使用同名的变量,也不会有任何冲突,它们是同名的,相互独立的,互不相关的。
旧式函数定义:
int bbb(m , n)
int m,n;
{
//函数体
}
9.函数调用
函数名(实参1, 实参2);
aaa();
bbb(12, 5);
形式参量(形参)是被调用函数中的变量(在函数头中声明),实际参数(实参)是调用函数传递给被调用函数的形参的特定数值。传递是复制操作,就是说被调用函数中对复制数值做的任何操作,都不会影响调用函数中的原数值。
函数调用的时候,将创建形参(局部变量),并将用实参作初始化。
10.使用return语句从函数中返回一个值,并终止函数的执行,将程序控制权交给调用函数的下一条语句。一般是函数体最后一条语句。该值就是函数的返回值,被存储在一个匿名变量中。因此,函数调用语句可用来赋值和参与运算。
若return返回的值类型与函数定义的返回值类型不一致,会被自动转换成定义的返回值类型。
函数之间的关系,调用与被调用;函数之间通过参数与返回值进行通信。C中所有函数同等地位,都可以调用其他函数或着被调用。
11.C允许一个函数调用其自身,这种调用过程称为递归。
递归原理:
每一级函数都有自己的私有变量;
每一次函数调用都会有一次返回;
函数中,位于递归调用前的语句和各级被调用函数拥有相同的执行顺序,位于递归调用之后的语句与各级被调用函数执行顺序相反;
虽然每一级函数都有自己的私有变量,但函数代码并不会得到复制;
递归函数中必须包含可以终止递归调用的语句。
尾递归,就是把递归调用放在函数末尾,return语句之前。尾递归的作用相当于循环语句。
递归的缺点,会很快占用大量内存。
12.多源代码文件的编译
main函数在一个源文件中,自定义函数在一个源文件中,函数原型和常量定义放在头文件中。
13.指针
指针就是内存地址,表现为无符号整数,通常是16进制格式。
指针变量(简称指针)是存放地址的变量。
指针的声明:
int * point;//指向一个整数变量的指针,数据类型是int *,*表示point是指针变量,int表示point指向一个整数变量。
char * chr;//指向一个字符变量的指针
float * flt;//指向一个单精度浮点数变量的指针
指针运算符:间接运算符(取值符)*,地址运算符(取地址符)&
&后跟一个变量名,&给出变量的地址,*后跟一个指针变量或地址,*给出存储在被指向地址中的值。
int a = 10, b;
int * point, * point2;
point = &a;
b = *point;
编写程序时,变量有三个属性,变量的名字,类型,数值;编译加载后,变量有两个属性,地址和数值。变量的地址可以看作在计算机中的名称。
14.指针作为函数的参数
将调用函数变量的指针作为实参传递给被调用函数的形参,可以改变调后函数的变量。
不要将被调用函数变量的指针作为返回值传递给调用函数,因为局部变量的生命周期在被调用函数执行完就结束了,被释放了,调用函数后续使用该值回造成错误。