一、函数定义的一般形式
1.无参函数定义的一般形式
类型标识符 函数名()
{
声明部分
语句部分
}
2.有参函数定义的一般形式
类型标识符 函数名(形式参数表列)
{
声明部分
语句部分
}
注: 1.函数类型如果不写默认为int型
2.返回值类型与函数类型不一致,将返回值强制类型转换为函数类型
3.函数的作用:降低耦合性,提高代码的复用性
二、形式参数和实际参数
1.在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。只有在发
生函数调用时,函数中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放
2.实参可以是常量、变量或表达式
3.在被定义的函数中,必须指定形参的类型
4.实参与形参的类型应相同或赋值兼容
5.在C语言中,实参向形参的数据传递是“值传递”,单向传递,只由实参传给形参,而不能由
形参传回来给实参
三、函数的调用
1.一般形式:函数名(实参列表);
2. 若调用无参函数,则“实参表列”可以没有,但括号不能省略
3.若实参表列包含多个实参,则各参数间用逗号隔开。
4.实参与形参的个数应相等,类型应匹配,实参与形参按顺序对应,一一传递数据
5.按自右而左的顺序求值
四、函数的嵌套调用
五、函数运行底层硬件逻辑的补充
五个寄存区:栈区(stack)、堆区(heap)、静态区、字符常量区、代码区
栈区:系统自动分配、释放空间,用于存放地址、函数定义的变量、形参(FILO:先进后出)未初
始化时值为随机值,执行到变量定义时开辟内存空间,超过变量作用域范围回收内存空间
堆区:手动申请开辟空间,
堆区:自己手动开辟空间,使用结束要记得释放空间,存储空间会比较大。(FIFO:先进先出)
静态区(全局区):存放在程序中定义的全局变量和静态变量。
字符串常量区:存放字符串常量,注意:不可以是字符型常量。eg:“hello”
代码区:是已经编译好的指令的存放空间;
例题:编写函数计算两个数的最大公约数和最小公倍数
int minOfTwoNumbers(int a,int b)
{
return a < b ? a : b;
}
int maxOfTwoNumbers(int a,int b)
{
return a > b ? a : b;
}
int GCD(int x,int y)
{
int i;
for(i = minOfTwoNumbers(x,y) ;i > 0 ;--i)
{
if (x % i == 0 && y % i == 0)
{
break;
}
}
return i;
}
int LCM(int x,int y)
{
int i;
for(i = maxOfTwoNumbers(x,y);i > 0 ;++i)
{
if (i % x == 0 && i % y == 0)
{
break;
}
}
return i;
}
int main(void)
{
int ret1 = GCD(4,8);
printf("最大公约数:%d\n",ret1);
int ret2 = LCM(4,8);
printf("最小公倍数:%d\n",ret2);
return 0;
}