声明:这只是读书笔记和总结
1.C的设计原则是把函数作为程序的构成模块。
9.1函数概述:
函数是用于完成特定任务的程序代码的自包含单元。
函数省去重复代码的编写
函数是的程序更加程序化
黑盒子观点。
9.1.1
函数原型,函数使用,函数定义
函数原型的声明只要在函数使用之前就可以
9.1.2
#include<stdio.h>
//void imin(int ,int); //一般的形式都是放在主函数之前。
int main(void){
void imin(int ,int);//放在这也可以 ,分号的使用表示该语句为函数声明语句
}
有些老版本编译器不支持的是void类型,新的编译器支持void类型。
当计算机执行到子函数时,控制权就由主函数变成了子函数,只有当子函数执行完成以后,才可以把控制权返回。
定义函数中的变量为局部变量,只能在子函数中使用,主函数定义相同的变量名互不关联。
9.1.3
形式参量:定义函数时所使用的变量,为子函数私有。
void dibs(int ,int)
void dibs(int x,y,z);//error
void dibs(int x,int y,int z)//ture
void dibs(a,b)
int a;
int b; //ture,这是ANSI之前的标准
9.1.4
实际参量是调用函数分配给被调函数变量的特定值。
把子函数当做为一个黑盒子,做好必要的注释。
9.1.5
return:
#include <stdio.h>
int imin(int a,int b);
void main(void){
int a = 1,b = 2 ,c = 0;
c = imin(a,b);
}
int imin(int a,int b){
if(a < b)
return a;
if(a>b)
return b; //返回最小值,c = imin(a,b)turn
}
当返回值与函数的返回值类型不对是,以函数的类型返回值为标准。
return的另一个作用就是终止函数,把控制权交给上一级函数。
9.1.6
函数的类型。在我们写C语言的时候,我们会在开头加入头文件eg:#include
int imin();
void main(void){
}
int min()
int a,b;
{
if(``)
else
}
如果函数使用的时候错误的输入了参数个数,编译器并不会报错,但是会有一个错误的答案。
运行机制在PC和VAX中:
调用函数首先把参数放在一个称作堆栈的临时存储区域,然后被调函数从堆栈中读取这些参数····
ANSIC的解决方案:
在函数声明的时候同时说明所使用的参数类型。
如果使用函数参数太多或太少就会报错。
如果参数的类型错误并不会报错,只会出现一个警告,进行类型转换。
无参数和不确定参数:
无参数时会在括号内写上空的数据类型
void imin(void)
对于不确定参数如printf(“”);
使用下面的原型声明:printf(char *,…);
这种原型参数表示第一个参数为一个字符串,而其他的参数不能确定。
C通过stdarg.h的头文件提供了定义该类函数的标准方法。
函数原型的优点:可以更好地发现错误,还有使用的更加方便。
9.3递归:
C允许一个函数调用它自身。这种调用过程叫做递归。需谨慎处理
eg:
#include<stdio.h>
void up_and_down(int);
int main(void) {
up_and_down(1);
return 0;
}
void up_and_down(int n){
printf("LEVEL %d : n Location %p\n",n,&n);/*1*/
if(n < 4){
up_and_down(n + 1);
}
printf("LEVEL %d : n location %p\n",n,&n);/*2*/
}
**结果:
LEVEL 1 : n Location 00000000009FFE30
LEVEL 2 : n Location 00000000009FFE00
LEVEL 3 : n Location 00000000009FFDD0
LEVEL 4 : n Location 00000000009FFDA0
LEVEL 4 : n location 00000000009FFDA0
LEVEL 3 : n location 00000000009FFDD0
LEVEL 2 : n location 00000000009FFE00
LEVEL 1 : n location 00000000009FFE30**
程序分析:
首先主函数调用了up_ang_down(1);
先执行1,此时n == 1;
然后调用自身,n == 2;
在执行1;此时n == 2;
然后调用自身,n == 3;
在执行1,此时n == 3;
然后调用自身,n == 4;
在执行1,此时n == 4;
在执行第四次,n == 4;
然后执行2,n == 4;
在执行第四次,n == 3;
然后执行2,n == 3
在执行第四次,n == 2;
然后执行2,n == 2
在执行第四次,n == 1;
然后执行2,n == 1
要上课了,明天继续!