1定义:

在C语言中,函数是一段具有特定功能的独立代码块,它可以接收输入参数、执行相关操作并返回结果。

2为什么需要函数

(1)代码复用:避免重复编写相同功能的代码, (2)模块化设计:将复杂程序分成多个小功能模块,每个函数负责一个独立任务,使代码逻辑结构更加清晰。一般一个函数的代码在50行左右 (3)好处:便于维护和调试(单个函数功能单一,出现问题容易定位和修改,不需要改动整个程序。 (4)提高开发效率:便于多人协同开发时,分工明确,编写不同函数,最终组合成完整程序。

3、函数的声明

(1) 基本语法

函数声明:返回类型 函数名(形参列表);函数首部+分号就是函数声明,只有函数声明而没有函数定义会编译报错
函数定义: 在函数声明的基础上添加函数体

返回类型 函数名(形参列表) { //函数体 } 只有函数定义而没有函数声明可能会编译警告或出错(函数声明可以忽略不写) 函数定义一般写在源文件中 .c.cpp

(2)分析语法

1> 返回类型 i. 数组不可以做函数的返回类型(弱化为指针) i.如果函数不需要任何返回值,则返回类型写为 void i.函数中,主要返回类型不是void,就一定需要用到return(若没有则有隐藏bug) i.如果返回类型是void,也可以使用return,通常书写形式为:return;只是用来结束当前函数 i.必须要确保函数全域返回。 2>函数名 i.与变量的命名规则一致(企业要求) i.>在C语言中,函数名也是函数的起始地址,函数名通过printf输出(十六进制) i.>在C语言中,不允许出现同名函数(c++例外) 3>形参列表 1.>在函数定义或声明时,函数首部中的函数称为形参(临时,调用完成后消失) i.在函数被调用时,其传递的参数称为实参,实参不带有类型 i.函数参数根据实际情况,可有可无,通常要求形参个数不超过5个。 形参和实参不仅个数和类型一一完全匹配。 多个参数之间需要通过逗号分隔 多个形参,其每个形参需要独立的类型,不能进行合并 参数分为:入参,出参,出入参 入参:从实参到形参的单向只传递(从内存角度看) 出参:能将数据通过参数带回给函数调用处 函数的参数可以是不固定个数,也可以是可变参数 实参变量名可以和形参不一样

函数传参的形式

值传递:单向值传递

指针传递

引用传递(C++)

(3)内存布局

栈区,堆区,全局/静态数据区、文本区、常量区

栈区:局部变量、函数形参

特点:由编译器自动分配和释放。遵循"先进后出"原则

堆区:通过malloc等函数动态开辟、Free动态释放的内存

全局/静态数据区:存储全局或静态数据

文本区:主要针对代码

常量区:主要存储代码

栈区,堆区、数据段(初始化数据段,未初始化数据段)、代码段

静态初始化变量只初始化一次,存在全局/静态数据区

(4)参数调用过程

A.参数压栈(保存相关数据信息

在函数调用前,先将参数从右到左的顺序如栈。先进后出

比如fun(a,b,c);先入栈c,后入栈b,最后入栈a

B.保存现场

保存当前函数的寄存器

C.挑战到被调函数

开始执行函数体

D.栈帧创建

被调函数先保存调用函数的栈基址,然后在创建自己的基地址,用于定位局部变量和参数

E.执行函数体

F.结果返回

函数中执行return时,将返回值保存在eax中。释放局部变量的栈空间,恢复调用函数的栈基址和寄存器等。

G.恢复现场

从栈中取出返回值,跳转回调用函数的下一条指令。

除去返回值

入栈,出栈

代码如下

#include <stdio.h>

`int main()
{
long long num1 = 0xAAAAAAAA;
long long num2 = 0xBBBBBBBBCCCCCCCC;
long long num3 = 0xDDDDDDDD;

    printf("%p, %p, %p\n", num1, num2, num3);

}

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI人工智能名片小程序源码系统,名片小程序+分销商城+AI客服,包含完整搭建教程

智能名片核心功能AI人工智能名片小程序的核心功能设计旨在彻底改变传统商务交流方式&#xff0c;为用户提供前所未有的智能化体验。个性化名片展示是系统的基础功能&#xff0c;用户可以通过丰富的模板库和自定义设计工具&#xff0c;创建独具特色的电子名片。系统提供多种预设…

React 教程:井字棋游戏

React 教程&#xff1a;井字棋游戏 使用 React 实现一个交互式的井字棋游戏&#xff0c;并配上好看的样式 // 导入必要的CSS样式和React库 import "./App.css"; import { useState } from "react";// Square组件 - 表示棋盘上的一个格子 function Square({…

React源码2 React中的工厂函数:createRoot()

#React V18.2 源码前置基础知识&#xff1a;工厂函数工厂函数是一种设计模式&#xff0c;用于动态创建对象或函数实例。其核心思想是通过封装对象创建的细节&#xff0c;提供统一的接口&#xff0c;从而增强代码的灵活性和可维护性&#xff0c;有一些核心作用&#xff1a;解耦创…

《UE5_C++多人TPS完整教程》学习笔记42 ——《P43 瞄准(Aiming)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P43 瞄准&#xff08;Aiming&#xff09;》 的学习笔记&#xff0c;该系列教学视频为计算机工程师、程序员、游戏开发者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09; Stephen Ulibarri…

SQL Server 临时表、表变量与WITH语句的用法与区别

引言 在SQL Server数据处理中,临时表、表变量和WITH语句(CTE)是关键的中间结果集管理工具。临时表适合大数据量操作,表变量优化小数据量场景,而CTE则简化复杂查询逻辑。三者选择需综合考量数据量级、事务需求及代码可读性。本文将深入解析其工作机制,通过实测对比指导场…

【Android】组件及布局介绍

一&#xff1a;代码分析 1&#xff1a;Android界面开发方式 &#xff08;1&#xff09;JavaView&#xff08;传统视图系统&#xff09; 这是 Android 早期的开发方式&#xff0c;用 Java 或 Kotlin 代码配合 XML 布局文件 来构建界面。&#xff08;简单了解即可&#xff09; 分…

Android 音视频 IPC序列化工具-Flattenable

Android Binder与AIDL与Service使用案例及分析-CSDN博客 讲讲这个类,被用在Android音视频中,跨进程序列化反序列化用。与Binder驱动有很强的联系。位于: feameworks/native/utils/Flattenable.h Flattenable, 译为令人满意的。可能是作者十分满意自己的这些作品吧,起了这…

文献学习|全面绘制和建模水稻调控组景观揭示了复杂性状背后的调控架构。

摘要&#xff1a; 解析调控复杂性状的机制对于推进作物改良至关重要。在此&#xff0c;我们提出了一个全面的水稻&#xff08;Oryza sativa&#xff09;调控组图谱&#xff0c;涵盖了来自三个代表性品种的23种不同组织的染色质可及性。我们的研究揭示了117,176个独特的开放染色…

Linux的压缩与解压缩

一、使用tar命令进行打包与解包 1.0、tar命令简介和常用选项 tar命令是Linux中经常使用的归档工具&#xff0c;它的主要功能是【对文件或者目录进行打包归档】&#xff0c;归档为一个文件&#xff0c;但是并不进行压缩&#xff1b;tar命令的归档操作效果如下&#xff1a; tar命…

OpenCV+OCR实现弧形文字识别

以下是基于OpenCV与OCR实现弧形文字识别的完整技术方案&#xff0c;结合了图像预处理、几何变换与OCR引擎调用等关键步骤&#xff0c;并提供优化技巧&#xff1a;&#x1f50d; 一、技术原理弧形文字识别的核心在于​​将弯曲文本转换为水平直线​​&#xff0c;便于OCR引擎处理…

【保姆级目标检测教程】Ubuntu 20.04 部署 YOLOv13 全流程(附训练/推理代码)

前言 YOLOv13 是 YOLO 系列的全新一代实时目标检测框架&#xff0c;在保持极高推理速度的同时显著提升了检测精度&#xff0c;广泛适用于嵌入式部署、工业质检、智能安防等多种场景。该版本提供了 Nano、Small、Large、X-Large 四种模型规格&#xff0c;用户可以根据计算资源和…

【大模型】到底什么是Function Calling和MCP,以及和ReAct推理的关系是什么?

文章目录背景&#xff1a;什么是Agent&#xff1f;背景&#xff1a;为什么需要Function Calling或者MCP&#xff1f;Function Calling和MCP在用户请求中的整体流程Function Calling&#xff08;函数/工具调用&#xff09;MCP (Model Context Protocol)ReAct (Reasoning and Act…

CANDENCE 17.4 进行元器件缓存更新

在我从立创商城导入CANDENCE元器件后&#xff0c;在ORCAD放置元器件时出现了下面的错误解决办法&#xff1a;1、在左边找到 Design Cache文件夹&#xff0c;在文件夹上鼠标右击选择 Cleanup Cache2、再放置该元器件&#xff0c;不管这个&#xff0c;点击确定3、这时候成功放上…

深入理解Kafka幂等性:原理、边界与最佳实践

一、什么是真正的消息幂等性&#xff1f; 消息系统的幂等性经常被误解&#xff0c;我们需要明确其精确含义和能力边界&#xff1a; 1. 正确定义 Kafka幂等性保证的是&#xff1a;在消息传输过程中&#xff0c;无论因网络重试、生产者重启等故障导致的消息重复发送&#xff0c;B…

【RTSP从零实践】8、多播传输H264码流的RTSP服务器——最简单的实现例子(附带源码)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

【Linux】基础开发工具(3)

1. 版本控制器Git1.1 Git的简史Git 的历史可以追溯到 2005 年1。当时 Linux 内核项目的开发团队一直使用 BitKeeper 进行版本管理&#xff0c;但由于一位 Linux 开发成员写了一个连接 BitKeeper 仓库的外挂&#xff0c;BitMover 公司决定中止 Linux 免费使用 BitKeeper 的授权1…

synchronized 的使用和特性

synchronized 锁对象 普通方法 synchronized 锁普通方法时&#xff0c;其锁的对象是调用该方法的实例 public synchronized void method() { // 方法体 } 静态方法 静态方法的锁对象是所属的 class&#xff0c;全局只有一个。 public static synchronized void staticMetho…

Gin Web 层集成 Viper 配置文件和 Zap 日志文件指南(下)

在微服务架构中&#xff0c;Gin 常被用作 Web 层框架&#xff0c;而 Viper 用于管理配置文件&#xff0c;Zap 则提供高性能的日志记录功能。下面将详细介绍如何在 Gin Web 层集成 Viper 配置文件和 Zap 日志文件。 1. 项目概述 假设我们有一个基于 Go 语言的微服务项目&#…

IoTDB:专为物联网场景设计的高性能时序数据库

什么是IoTDB&#xff1f;IoTDB&#xff08;Internet of Things Database&#xff09;是一款开源的时序数据库管理系统&#xff0c;专为物联网&#xff08;IoT&#xff09;场景设计&#xff0c;由清华大学软件学院团队自研&#xff0c;天谋科技团队负责维护。它针对物联网数据的…

[netty5: MessageAggregator HttpObjectAggregator]-源码解析

在阅读这篇文章前&#xff0c;推荐先阅读 [netty5: ByteToMessageCodec & MessageToByteEncoder & ByteToMessageDecoder]-源码分析[netty5: HttpObject]-源码解析 100-continue 100-continue 是 HTTP/1.1 协议中的一种机制&#xff0c;用于客户端在发送大体积请求体…