本章重点:函数声明,函数定义,传参机制,递归函数,编译预处理,作用域和生命周期
一、【函数的声明】
好处: 当函数定义在前,调用在后时,可以省略函数的声明,但这不是好的变成习惯,因为这样做,程序中函数出现的顺序就不能随意改变,维护起来就非常困难,如果有新的开发者参与进来也非常困难。所以好的编程时尽量:
将主函数放在程序的起始位置,并先声明函数原型。
目的:告诉编译器该函数类型,参数个数和类型,检查调用是否正确,所以不会在这时分配内存给函数。
声明方式:函数类型 函数名(形参类型 参数名);
warining: 注意声明是一条语句必须以分好结尾, 函数形参的参数名可以省略。
函数类型,函数名,形参类型,形参个数,形参顺序必须与函数定义相同。
当调用在前,定义在后时必须要声明函数。
因为main函数事主函数不会被其它函数调用,所以不用声明。
二、【函数定义】
定义方式: 数据类型 函数名(形参表){}
warning: 形参格式 参数类型(基本类型|指针类型|构造类型|类) 形参名 ,形参只是一个符号,并不占据内存空间,指标值参数出现的顺序。
但函数没有返回值时用 void
函数体 不能嵌套定义函数,既不能在一个函数体内定义另一个函数
空函数 数据类型 函数名(){} 其实这里我更推荐这样定义 void 函数名(){}往往用来占位
return; return [(表达式)];括号可以省略,离开当前代码块,返回特定数据给主调函数,一般情况下返回类型应该与函数类型一致,如果不一致系统间进行类型转 换,并以函数类型为准;只能返回一个值;无返回值可以不用return语句,但不推荐;
三、【函数调用】
调用方式: 函数名(实参表);
warning : 参数类型和顺序要与生命的一样,可以使常量或者变量
四、【参数传递】
【变量值调用】:其实是系统将实参考被一个副本给参数。形参是普通变量名,实参也是普通变量名。
【引用传递】 :形成拿生命为引用类型只要在标识符前边加个&,实参也是普通变量名。int &就是一个引用类型。修改不再作用于局部,不再有高额的时间和空间开 销。
【变量地址传递】:形参必须是可以接受地址的指针变量,实参是变量的储存地址。
【数组的传递】:形参字需要在标识符后边加上一个[]即可,一般数组要把元素个数也作为参数,字符数组不用。形参数组类型应该和是参数组类型一样。实参是数组 名。形参为二维数组名时,可以省略第一维的大小,但不能省略第二维的大小,或者两维都省略。因此int array[][],int array[2][]及int *array 都是错误的。当然形参也可以使用指针变量接受数组参数。也可以用引用类型,typedef int array[10];然后使用array来定义数组的引用。函数声 明void max(array &d,int d);此函数的一个参数可以接收int a[10];这种数组。
五 【函数的指针】
定义:一个函数在编译时被分配一个入口地址(第一条指令的地址)可以将该地址非配给一个指针变量,这样,指针变量持有该函数入口地址,他就指向了该函数。
形式:数据类型 (*指针变量名) (形参类型);
[code]
int (*funp)(int a,int b);
int func(int a,int b){}