一、函数参数
1、实参向形参的数据传递是“值传递”,单向传递,只能有实参传给形参。函数的形参相当于实参的复制,对形参进行修改不会对实参产生影响。
2、无法在被调函数中修改主调函数的参数。
3、函数有两个参数或以上,c语言默认传参自右向左,结合的过程不可能同时传参。
4、栈区是计算机内存的一部分,主要用于存放函数的局部变量、函数参数和返回地址等信息。栈区遵循后进先出(LIFO, Last In First Out)的原则,最后压入栈中的数据先被弹出。在程序执行过程中,每当一个函数被调用,相关的变量和状态信息就会被压入栈中;当函数执行完毕,这些信息就会从栈中弹出。
注:(1)内存管理:栈区的内存由操作系统自动管理。函数调用时自动分配内存,函数返回时自动释放内存。
(2)大小限制:栈区的大小通常较小,受到操作系统和编译器的限制。过深的递归调用可能导致栈溢出。
还存在堆区:用于动态分配内存的区域。程序在运行时可以通过特定的函数请求内存。堆区的内存管理由程序员负责,需要手动释放,由于其动态特性,堆区的内存分配和释放可能会比较频繁。
字符串常量区:存放程序中所使用的字符串常量的地方。这些字符串在程序编译时就分配了内存,并且在程序运行时是只读的。修改它们会导致未定义行为。
静态区(全局区):用于存储全局变量、静态变量以及常量等。这个区域在程序加载时分配内存,并在程序结束时释放。静态变量和全局变量在程序的整个运行过程中都存在,生命周期与程序相同。
代码区:存放程序的可执行代码(指令)的区域。这个区域通常是只读的,以防止程序在运行时修改自己的指令。代码区在程序加载时就被加载到内存中。
二、函数的调用
1、函数语句
把函数调用作为 一个语句。
2、函数表达式
函数出现在一个表达式中,这种表达称为函数表达式,这是要求函数带回一个确定的值以参加表达式的运算 。
3、函数参数
函数调用作为一个函数的实参
三、函数的嵌套
1、C语言不能嵌套定义函数,但可以嵌套调用函数。
四、函数的递归
1、在调用一个函数的过程中又直接或间接的调用该函数本身,称为函数的递归调用 。
2、用递归来求阶乘
int fn(int n)
{
if(1 == n)
{
return 1;
}
else
{
return fn(n - 1) * n;
}
}
3、斐波那契数以及和
int fib(int n)
{
if(1 == n || 2 == n)
{
return 1;
}
else
{
return fib(n - 1) + fib(n - 2);
}
}
int sumOfFib(int n)
{
if(1 == n)
{
return 1;
}
else
{
return sumOfFib(n - 1) + fib(n);
}
}