目录
设计函数
- 能拆成函数的尽量拆成函数
- 函数设计时尽可能考虑健壮性和拓展性,代码鲁棒性(健壮性)最强越好
函数调用的关系
调用者 被调用者
int main(void)
{
printf("%d",getMonthdays(y,m));
return 0;
}
这个代码中
调用者main(main函数是整个函数的入口),被调用者getMonthdays(getMonthdays中可以继续调用别的函数,此时getMonthdays成为调用者,说明调用关系是相对的)
注意:函数不支持嵌套定义,但是支持嵌套调用
函数名——函数的入口地址
递归
特殊的嵌套调用——递归——自己调用自己
递归类似于循环,递归是一种特殊的循环
递归思路:要求问题n,依赖于问题n-1的解决
递归代码实现思路
递推关系:
怎么从问题n到问题n-1
sum(100)->sum(99)+100
sum(99)->sum(98)+99
...
sum(n)->sum(n-1)+n;
递推结束条件
n=1
#include<stdio.h>
int sum(int n)
{
if(n==1)
{
return 1;
}
else
{
return sum(n-1)+n;
}
}
int main(void)
{
int ret = sum(100);
printf("sum = %d",ret);
return 0;
}
直接递归:一个函数直接调用自身
间接递归:一个函数通过调用其他函数间接调用自身,间接递归可能涉及两个或多个函数相互调用
函数调用的本质:实际上是利用栈的层次结构——先进后出——保证函数可以层层嵌套调用
栈FILO(First In Last Out先进后出):入栈保存现场、出栈恢复现场实现函数的层层调用
栈
C语言角度的栈本质上是一块内存空间,只是按照栈这种数据结构来处理和使用的
栈也可以放局部变量、空间自动申请、自动释放
栈:数据结构(表示数组组织形式)
数组也是数据结构,但是是随机存储
内存的5个区域
C语言程序把内存划分为5个区域:
栈:主要用来存放自动变量或者函数调用的数据、linux系统默认8M(可以修改)
堆:空间大、堆上的空间手动申请手动释放
字符串常量区:例如"linux"的存放、只读
静态区(全局区):全局变量和静态变量(未初始化默认为0)
代码区:只读
程序=代码+数据
#include<stdio.h>
int main(void)
{
unsigned char buf[1024*1024*8];
printf("linux!\n");
return 0;
}
代码运行会出现段错误Segmentation fault (core dumped) 这是栈的大小限制引起的
数组作为函数参数
- 数组元素作为函数参数
- 数组本身作为函数参数
数组元素作为函数参数
当数组元素作为函数参数时,我们只需要传递单个元素
int a[10]={1,2,3};
int add(int a,int b)
{
return a+b;
}
add(a[0],a[1]);
数组本身作为函数参数
一维整型数组做函数参数
数组可以作为函数参数传递,但在函数定义中,数组的大小不是必须指定的
eg:
void printArray(int a[],int len)——(定义)形参:写成数组形式,需要数组长度
void printArray(int *a,int len)——编译器最终理解的形式
printArray( a,len)——(调用)实参:数组名,数组长度
在函数声明或定义中,形参可以写成数组的形式。此时 a
表示一个整数数组。
编译器最终将数组形式的参数理解为指针形式。即使写成数组形式,编译器仍会将其视为指向该数组首元素的指针。
实参的传递:在调用函数时,传递数组名(代表数组的首元素地址)和数组的长度。实参是数组名和数组长度。数组名代表数组的首元素的地址。
标签:function2,函数,int,sum,函数参数,调用,数组 From: https://blog.csdn.net/weixin_62409078/article/details/140863770int a[10];
数组名代表类型——int [10]这种数组类型
数组名代表地址——首元素的地址