首页 > 其他分享 >函数function2、栈

函数function2、栈

时间:2024-08-02 18:54:25浏览次数:8  
标签:function2 函数 int sum 函数参数 调用 数组

目录

设计函数

函数调用的关系

递归

内存的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]这种数组类型

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

标签:function2,函数,int,sum,函数参数,调用,数组
From: https://blog.csdn.net/weixin_62409078/article/details/140863770

相关文章

  • 大话C语言:第34篇 指针与函数的关系
    1指针作为函数的参数指针作为函数的参数,语法格式:返回数据类型函数名(数据类型*指针变量1,...,数据类型*指针变量1)注意,指针变量的数据类型可以为任何数据类型,包括基本数类型和自定义数据类型代码示例:voidswap(int*ptr1,int*ptr2){//提前保存ptr1指向对象......
  • Pandas的30个高频函数使用介绍
    Pandas是Python中用于数据分析的一个强大的库,它提供了许多功能丰富的函数。本文介绍其中高频使用的30个函数。read_csv():从CSV文件中读取数据并创建DataFrame对象。importpandasaspddf=pd.read_csv('data.csv')read_excel():从Excel文件中读取数据并创......
  • 输入“func start”命令时会找到并运行函数,但在命令 func azurepublish 时无法识别函
    本质上我有一个正在尝试部署到天蓝色的功能。当我输入“funcstart”时,该函数在本地运行,并且可以将发布请求发送给它。然而,当我尝试将函数部署到azure时,部署总是成功,但函数本身永远不会推送到azure。即远程构建成功![2024-07-26T15:17:11.932Z]同步触发器...函数位于:.........
  • Python基础教程:全方位掌握print函数
    文章目录1.基本打印2.打印多个参数3.格式化输出使用`%`格式化使用`.format()`方法使用f-string(Python3.6+)4.自定义分隔符5.抑制换行6.打印到文件7.打印对象的字符串表示8.打印时的错误处理9.立即刷新输出缓冲区10.结语1.基本打印打印文本或变......
  • 【AI冰封挑战】搭档函数计算,“冰”封你的夏日记忆
    在AI绘画领域,StableDiffusion、WebUI、Midjourney等工具各领风骚,但ComfyUI以其独特的自动化工作流机制,自问世以来便迅速崭露头角,成为众多应用开发者和艺术创作者的新宠。它不仅革新了AI生图的创作流程,更以高效的自动化水平,为AI绘画领域开辟了全新的篇章。夏日炎炎,别让高......
  • 在flask缓存中指定每个函数的缓存阈值(执行函数时清除旧值)
    使用flask-caching时memoize的默认行为是如果指定的超时已到则执行该函数,然后返回并保存新结果。但是,现在过时的(之前缓存的)结果不会被删除。这对于大多数应用程序来说没问题,但如果缓存结果很大,就会出现问题。flask-caching暴露CACHE_THRESHOLD......
  • Hive学习第十天--函数的用法结尾
    Hive自定义函数UserDefineFunction主要分为三大类:​ UDF:一对一​ UDTF:一对多​ UDAF:多对一注意:1、区分的条件只要看前后输入输出之后的行数的变化​ 2、UDF可以连续嵌套调用,类似于if语句UDF:一进一出定义UDF函数要注意下面几点:继承org.apache.hadoop.hive.ql.ex......
  • {Python} 有没有办法从函数中“提取”返回值变量并在其他地方使用它,而不调用原始函数?
    第一次在这里发帖。对python来说相对较新,我正在开发一个程序,它基本上是一个随机故事生成器,用于学习语言、发展技能并添加到我的投资组合中。我有一个主文件(最初启动该程序)、一个简介文件(对于介绍部分,获取用户名以及我试图“提取”user_name变量的位置),一个函数文件,其中包......
  • 使用Cython调用CUDA Kernel函数
    技术背景前面写过一篇关于Cython和C语言混合编程的文章,在Cython中可以使用非常Pythonic的方法去调用C语言中的函数。另外我们也曾在文章中介绍过Python中使用CUDA计算的一种方案。其实从Python中去调用CUDA有很多种解决方案,例如直接使用MindSpore、PyTorch、Jax等成熟的框架进行G......
  • 回调函数和qsort,strcmp函数
    有任何不懂的问题可以评论区留言,能力范围内都会一一回答1.回调函数是什么?回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,......