【C语言基础】函数

news2024/12/23 19:13:19

        C语言中的函数是模块化编程的基础,通过函数的定义、实参与形参的传递以及函数的调用流程,我们可以实现代码的重用和逻辑的封装。本文将深入探讨C语言函数的定义方式、实参与形参的传递机制,以及函数的调用流程和局部变量与栈内存的关系。

一、函数的定义

         C语言函数由函数头和函数体组成。函数头包括返回类型、函数名和参数列表,用于声明函数的类型和参数信息。函数体包含了实际的代码逻辑。

         示例:封装一个加法器

int add(int a, int b)
{
    int sum = a + b;
    return sum;
}

        如果我们调用这个函数我们只需要给他输入两个参数 a ,b 就可以得到 a+b 的值,这就完成了一个简单函数的封装和调用,如下:

int add(int a, int b) 
{
    int sum = a + b;
    return sum;
}

int main()
{
    int x = 5;
    int y = 3;
    int result = add(x, y);  
    printf("The result is: %d\n", result);
    return 0;
}

二、形参和实参

        函数在被调用时,通过实参传递数值给形参。实参是函数调用时传递的具体数值,而形参是函数定义中声明的变量,用于接收实参的值。实参与形参之间的传递可以通过值传递或指针传递来实现。

        示例:


// 它们的值由实参一一对应初始化
 int max(int x, int y) // 函数定义中,x、y都属于形参,位于函数 max 的栈内存中
 {
 int z;
 z = x>y ? x : y;
 return z;
 }

int main(void)
{
     int a = 1;
     int b 2;
     int m;

    //函数调用中a、b都属于实参,存储于主函数man的栈内存中

    max(a,b);

}

三、函数的调用流程

        在函数被调用时,以下是函数调用的基本流程:

       (1) 保存返回地址:函数调用前,将下一条指令的地址保存在栈中,以便函数执行完后返回到正确的位置;
       (2) 传递参数:将实参的值传递给函数的形参,可以通过值传递或指针传递来实现;
       (3)分配局部变量空间:为函数中定义的局部变量分配内存空间;
       (4)执行函数体:执行函数中的代码逻辑;
       (5)返回结果:将函数的返回值传递给调用者,并将控制流程返回到调用点。

四、局部变量与栈内存

        函数中定义的局部变量存储在栈内存中。每当函数被调用时,将为局部变量分配内存空间,函数执行完后,该内存空间将被释放。局部变量只在函数内部可见,其作用域限定在函数体内。 

        示例:

int add(int a, int b)
{
    int sum = a + b;  // 局部变量 sum
    return sum;
}

int main()
{
    int x = 5;  // 局部变量 x
    int y = 3;  // 局部变量 y
    int result = add(x, y);
    printf("The result is: %d\n", result);
    return 0;
}

        本文对C语言函数进行了综合总结,涵盖了函数的定义、实参与形参的传递机制,函数的调用流程以及局部变量与栈内存的关系。通过深入理解函数的概念和工作原理,我们能够更好地利用函数实现代码的模块化和封装,提高程序的可读性和可维护性。

        最后举一个综合性例子:

#include <stdio.h>


//  使这个重复使用的代码封装起来
void show_array(int a[], int n)
{
	for(int i=0; i<n; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}


// 有些函数可以不需要参数,也可以不要返回值
void menu(void)
{
	printf("---开始---\n");
	printf("---继续---\n");
	printf("---结束---\n");
}


int main(void)
{
	int a[5] = {1, 2, 3, 4, 5};
	int b[7] = {1, 2, 3, 4, 5, 6, 7};
	int c[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 2};
	
	show_array(a, 5);
	show_array(b, 7);
	show_array(c, 10);
	
	return 0;
}

        希望本文能够帮助读者更好地理解C语言函数的使用和调用流程,为进一步学习和开发C语言程序打下坚实的基础。如果有任何疑问或建议,请在评论区留言,我将尽快回复。谢谢阅读!

        今天的分享就到这里啦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/726188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业快递管理制定教程

在经济飞速发展的助力之下&#xff0c;现代企业接触到的制度越来越多&#xff0c;除了我们熟知的CRM、OA等等&#xff0c;管理制度进一步细分。企业寄件在企业内部运转中的地位越发重要&#xff0c;随之也产生了快递管理制度。不少人就会问&#xff1a;有必要这么细分吗&#x…

跨应用连接同一个redis,从redis取缓存,对象属性值都为null

本地idea部署和docker部署问题&#xff0c;连接同一个redis&#xff0c;idea项目的redis缓存&#xff0c;docker中取不到&#xff0c;docker中缓存的redis本地取不到 ✅ 原因&#xff1a;idea本地代码实体类未进行代码混淆&#xff0c;docker代码实体类进行了混淆&#xff0c;…

Caused by: java.io.IOException: CreateProcess error=206, 文件名或扩展名太长

java.io.IOException: Cannot run program "D:\javaAPP\jdk\bin\java.exe" (in directory "D:\java\demo"): CreateProcess error206, 文件名或扩展名太长。 Caused by: java.io.IOException: CreateProcess error206, 文件名或扩展名太长。 删除项目.ide…

Vue -- 生命周期 数据共享

1 组件的生命周期 1.1 生命周期 & 生命周期函数 生命周期&#xff08;Life Cycle&#xff09;是指一个组件从创建 -> 运行 -> 销毁的整个阶段&#xff0c;强调的是一个时间段。 生命周期函数&#xff1a;是由 vue 框架提供的内置函数&#xff0c;会伴随着组件的生命…

leetcode极速复习版-第一章数组

目录 数组 数组理论基础 704二分查找 27移除元素 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II 数组部分总结 数组 数组理论基础 数组的元素是不能删的&#xff0c;只能覆盖。 二维数组&#xff1a; 704二分查找 二分法 middle int(left right)的int 直接对着一个…

SSM学习笔记-------SpringMVC(一)

SSM学习笔记-------SpringMVC_day01 SpringMVC_day011、SpringMVC简介1.1 SpringMVC概述 2、SpringMVC入门案例2.1 需求分析2.2 案例制作步骤1:创建Maven项目&#xff0c;并导入对应的jar包步骤2:创建控制器类步骤3:创建配置类步骤4:创建Tomcat的Servlet容器配置类步骤5:配置To…

【2022吴恩达机器学习课程实验翻译笔记】 Python 和 Jupyter Notebook 简介

为了看着比较连贯&#xff0c;我直接翻译了&#xff0c;不放英文原文对照了 选修实验课: Python 和 Jupyter Notebook 简介 欢迎来到第一节选修实验课 选修实验课的目的是&#xff1a; 提供信息&#xff0c;就像这个notebook一样通过实例加深对课程的理解展示在课程中使用的…

【Unity实战】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(二)(附源码)

文章目录 前言一、火箭筒1. 编写火箭筒脚本2. 创建火箭弹和新爆炸特效的预制体3. 编写火箭弹脚本4. 设置好火箭弹和火箭筒的脚本和参数5. 运行效果 二、激光枪1. 编写激光枪脚本2. 先运行游戏&#xff0c;看看效果3. 美化射线4. 完善代码5. 再次运行游戏6. 升级URP项目7. 后处理…

剑指offer13.机器人的运动范围

一开始没看清题目&#xff0c;没看到要一步一步移动&#xff0c;我以为是看所有格子中有几个格子符合条件&#xff0c;就直接遍历所有格子&#xff0c;把每个格子的i&#xff0c;j每个位数上的数相加看看是否小于k&#xff0c;是就给counts加一最后返回couts&#xff0c;我还说…

OSPF小实验

OSPF小实验 要求&#xff1a; 1、地址配置 R1&#xff1a; R2&#xff1a; R3&#xff1a; R4&#xff1a; R5&#xff1a; R6&#xff1a; 2、启用R1-R3的ospf&#xff0c;划分为区域0 R1&#xff1a; R2&#xff1a; R3&#xff1a; 3、R1-R2之间采用ppp的pap单向认证 R1为…

select + option 获取 value 来 innerHTML 插入内容或元素

目录 select optioninnerHTML 在元素中插入内容 select option 可以实现一个下拉选择&#xff0c;选择到那个&#xff0c;就可以获取其value&#xff0c;并且弹窗。 <!DOCTYPE HTML> <html><head><meta charset"utf-8"><style>.st…

【数据结构与算法】查找课后习题

题目 下面一共有4道有关查找的课后习题&#xff0c;全部都是思路题、画图题并不是完整的算法设计题故在此就一起列举出来了~ 1. 已知一个有序表的表长为8N&#xff0c;并且表中没有关键字相同的记录 假设按如下所述方法查找一个关键字等于给定值K的记录&#xff1a;先在第8,1…

Jmeter性能优化方案

最近用jmeter测试并发出现了访问端口异常问题的排查及解决方案做一个归纳&#xff1a; 背景&#xff1a;接口压测异常情况发生率达到了99% 线上情况&#xff1a; 错误情况展示&#xff1a; 原因&#xff1a; Jmeter里的http sample勾选了keep alive&#xff0c;导致会话一直…

2022年真题 - 16 - cockpit

cockpit 题目配置 题目 安装 cockpit 来检测 ispsrv 服务器的状态 配置 安装 cockpit [rootStorageSrv ~]# yum -y install cockpit启动服务 [rootStorageSrv ~]# systemctl enable --now cockpit.socketInsideCli 浏览器访问 http://192.168.100.200:9090

【数据结构与算法】假设图采用邻接表存储,判断一个未知顶点个数和边数的无向连通图G是否是棵树

题目 Qestion: 设计一个算法,判断一个未知顶点个数和边数的无向连通图G是否是棵树,假设图采用邻接表存储。若是树,返回true;否则返回 false。 (用图1和图2验证作业题2算法的正确性) 图一图二的邻接表结构 运行结果以及其解释 由结果可知图一为无向连通图&#xff0c;图二不为…

基于Arcgis 一带一路地图制作 沿途主要城市 路线

数据准备&#xff1a; 全球范围的DEM地形数据 海上丝绸之路节点城市shp陆上丝绸之路节点城市shp全球行政区域shp 全球的shp和主要城市 数据&#xff1a;下载 海上丝绸之路节点城市和陆上丝绸之路节点城市shp&#xff1a;下载 一带一路沿途经济走廊shp&#xff1a;下载 数据…

【Linux】Linux基础命令-cp、ls、mv、chmod、rm、mkdir、cd、find、pwd

1.添加用户 &#xff08;1&#xff09;切换到管理员 sudo su &#xff08;2&#xff09;添加用户 addusr zhangdi &#xff08;3&#xff09;设置密码 &#xff08;4&#xff09;切换到自己的账号 su zhangdi 2.mkdir、cd命令&#xff0c;要求能建立目录、进入与退出目录 &a…

Linux下打包发布QT程序,并运行在其他没有安装QT环境的linux系统上

一、Linux下打包发布步骤如下 编译应用程序环境&#xff1a;ubuntu18.04版本开发环境&#xff1a;Qt5.14.2编译环境&#xff1a;gcc_64要移植的电脑&#xff1a;ubuntu18.04版本&#xff0c;没有开发环境 第一步&#xff1a;打包依赖库 1、创建一个打包目录&#xff0c;把生…

JavaScript Day11 DOM事件机制

事件机制 HTML DOM 允许 JavaScript 对 HTML 事件作出反应。JavaScript 能够在事件发生时执行&#xff0c;比如当用户点击某个 HTML 元素时。 为了在用户点击元素时执行代码&#xff0c;请向 HTML 事件属性添加 JavaScript 代码&#xff1a; <div iddiv1>我是一个div&…

如何在Microsoft Excel中进行不连续区域批量填充

快速填充是 Excel 最令人惊叹的功能之一,它因让一个需要数小时手动执行的乏味任务瞬间自动执行而得名,然而它也有局限性: 结果不是动态的。当你更改其所基于的值时,快速填充值不会更新。你需要再次执行快速填充才能更新值。 快速填充可能并不总是返回结果。该模式对于 Exce…