函数调用
函数分为调用函数和被调用函数,通常在主函数中用于实现功能的函数我们称为被调用函数。
main函数是程序的入口,只能在在主函数中调用其他函数,但主函数不能被调用。在调用函数时可以嵌套调用。比如在主函数中调用比大小函数,在比大小函数中调用求和函数,最终实现比大小和求和的功能。
函数的调用实际上是利用了栈的结构,实现先入后出保证了函数可以层层嵌套调用。
栈
栈实质上为内存中的一片空间,默认为大小为8mb,自动申请自动释放。栈的空间固定,每一次递归都会占用栈空间,如果递归次数过大则会占满栈空间导致运行错误。
C语言中内存被划分为五个部分:栈、堆、字符串常量区、静态区和代码区
栈:主要用来存放自动变量和函数调用的数据。
堆:手动申请,手动释放的大空间。
字符串常量区:存放字符串常量,且存放内容为只读,不能被更改。
静态区:存放全局变量和静态变量。
递归
递归是一种在函数中自己调用自己的特殊的函数调用.
代码示例:
sum函数是一个求和函数,在sum函数中只有当a等于一时会有实际返回值1,当a不为一时,将a重新输入进了sum函数,将sum(a-1)的结果作为返回值。可以想象a在sum函数中将会不断减小,直到为1,此时才有了确定的值“sum(1) + 1”,作为确定值,他的上一层“sum(2) + 2“也才成为确定值,最终一层一层向上返回确定值,最终回归到开始的第一层”sum(a) + a“,将其作为返回值传递给主函数。这种一层一层回归的方式被称为递归。
int sum(int a)
{
if(a==1)
return 1;
else
return sum(a-1) + a;
}
sum(100)
|--sum(99) + 100
|--sum(98)+99
|--sum(97)+98
...
|--sum(3)+4
|--sum(2)+3
|--sum(1) + 2
1
递归的思路:遇到问题向上一层走。将多层的问题逐步拆解为可以重复的多层操作。
代码示例:
求阶乘函数
int plus(int a)
{
if(a==1)
return 1;
else
return plus(a-1) * a;
}
数组作为函数参数
数组元素可以作为函数参数,数组本身也可以作为函数参数。数组元素作函数参数时,可以理解为独立的数,参与函数的计算;数组作函数参数时,需要在形式参数中标明数组名和数组长度。
int strsum(int ary[],int len); //函数声明
函数名代表数组的数据类型,同时代表首元素的在内存中的地址。形参中的写法”ary [ ]“在编译器中会被理解为”int *ar
y“,表示向函数传递地址,函数接收到地址后的操作直接在原数组的内存空间上进行操作,相比传递值的方式,址传递的方式效率更高,但更加复杂。
在数组名后加下标运算符是表明形参为数组,防止与整型数混淆,但在调用函数时,实参可以直接使用数组标识符。
代码示例:
//打印
void printarray(int a[],int len)
{
int i;
for(i=0;i<len;++i)
{
printf("a[%d] = %d\n",i,a[i]);
}
}
//插入升序
void aryinsert(int a[],int len)
{
int i,tmp;
for(i=1;i<len;++i)
{
tmp = a[i];
while(i>0 && tmp < a[i-1])
{
a[i] = a[i-1];
--i;
}
a[i] = tmp;
}
}
//二分查找
int arysearch(int a[],int len,int x)
{
int begin,end,mid;
begin = 0;
end = len - 1;
while(begin <= end)
{
mid = (begin + end) /2;
if(a[mid] < x)
begin = mid +1;
else if(a[mid] > x)
end = mid - 1;
else
break;
}
if(begin <= end)
return mid;
else
return -1;
}
//主函数
int main(void)
{
int max,x;
int a[] = {3,8,1,-8,6,4,12,5,7};
int len = sizeof(a)/sizeof(a[0]);
//打印数组
printarray(a,len);
//插入排序
aryinsert(a,len);
printf("-------------\n");
//打印数组
printarray(a,len);
//二分查找
printf("Input x to be found:\n");
scanf("%d",&x);
if (arysearch(a,len,x) >= 0)
printf("a[%d] = %d\n",arysearch(a,len,x),x);
else
printf("Not found\n");
return 0;
}