函数function2、栈

目录

设计函数

函数调用的关系

递归

内存的5个区域

数组作为函数参数


设计函数

  1. 能拆成函数的尽量拆成函数
  2. 函数设计时尽可能考虑健壮性和拓展性,代码鲁棒性(健壮性)最强越好

函数调用的关系

调用者        被调用者

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) 这是栈的大小限制引起的

数组作为函数参数

  1. 数组元素作为函数参数
  2. 数组本身作为函数参数

数组元素作为函数参数

当数组元素作为函数参数时,我们只需要传递单个元素

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 表示一个整数数组。

编译器最终将数组形式的参数理解为指针形式。即使写成数组形式,编译器仍会将其视为指向该数组首元素的指针。

实参的传递:在调用函数时,传递数组名(代表数组的首元素地址)和数组的长度。实参是数组名和数组长度。数组名代表数组的首元素的地址。

int a[10];

数组名代表类型——int [10]这种数组类型

数组名代表地址——首元素的地址

  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值