13- 函数的定义与使用+形参实参区分

13- 函数的定义与使用+形参实参区分

文章目录

  • 13- 函数的定义与使用+形参实参区分
    • 一、函数的定义与使用
      • 1.1 函数的结构
        • 1. 函数头
        • 2. 函数体
      • 1.2 示例代码
        • 例子 1:无参数和无返回值的函数
        • 例子 2:带参数和返回值的函数
      • 1.3 函数的基本语法
      • 1.4 函数的使用示例
        • 例子 3:计算两个数的乘积
      • 1.5 低耦合,高内聚
    • 二、形参与实参
      • 2.1 概念
      • 2.2 实参与形参的关系
      • 2.3 函数调用的过程
      • 2.4 局部变量与栈内存
        • 2.4.1 局部变量的特点
        • 2.4.2 栈内存的特点
      • 2.5 示例代码

一、函数的定义与使用

在 C 语言编程中,函数是代码的基本模块。它们允许将复杂的程序分解成更小、更易管理和重用的部分。函数定义提供了函数的具体实现,而函数调用用于执行该函数。

1.1 函数的结构

一个函数的基本结构包括:函数头函数体

1. 函数头

函数头: 函数对外公开的接口信息。 比如:void *calloc(size_t nmemb, size_t size);

  • 返回值类型:函数返回给调用者的数据类型。如果函数不返回值,则使用 void
  • 函数名:遵循变量命名规则,应具有描述性,使人容易理解函数的作用。
  • 参数列表:括号内列出函数需要的输入参数。每个参数需要指定类型和名称,多个参数之间用逗号分隔。如果函数不需要参数,可以省略参数列表,写成 ()
2. 函数体
  • 函数体:用大括号 {} 括起来的代码块,包含函数的具体实现。
  • 返回语句:使用 return 语句返回值给调用者。对于 void 类型的函数可以省略 return 语句,或写作 return;

1.2 示例代码

以下是一个简单的函数示例,包括定义和调用:

例子 1:无参数和无返回值的函数
#include <stdio.h>// 函数定义
void greet() {printf("Hello, World!\n");
}int main() {// 函数调用greet();return 0;
}
例子 2:带参数和返回值的函数
#include <stdio.h>// 函数定义
int add(int a, int b) {return a + b;
}int main() {int result = add(5, 3); // 函数调用printf("Result: %d\n", result);return 0;
}

1.3 函数的基本语法

返回值类型 函数名 (参数1类型 参数1, 参数2类型 参数2, ...) {// 函数体return 返回值; // 对于非 void 类型的函数
}

1.4 函数的使用示例

例子 3:计算两个数的乘积
#include <stdio.h>// 函数定义
int multiply(int x, int y) {return x * y;
}int main() {int num1 = 4;int num2 = 5;int product = multiply(num1, num2); // 函数调用printf("Product: %d\n", product);return 0;
}

1.5 低耦合,高内聚

  • 低耦合:函数应该尽量独立,减少与其他函数或模块的依赖。这样修改一个函数时,不会影响其他函数。
  • 高内聚:函数应尽量专注于完成一个单一的任务。这使得函数更容易理解、测试和维护。

二、形参与实参

在C语言中,函数调用是通过实参(实际参数)和形参(形式参数)之间的传递来实现的。

2.1 概念

  • 实参:函数调用时传递给函数的值或表达式。例如,max(123.034, 'C', "87"); 中的 123.034, 'C', 和 "87" 是实参。
  • 形参:函数定义时在参数列表中出现的变量。例如,max(float a, char b, char *c) 中的 a, b, 和 c 是形参。

2.2 实参与形参的关系

  1. 对应关系:实参和形参在数量、顺序和类型上必须一一对应
  2. 初始化:调用函数时,形参被实参的值初始化。例如,当调用 max(123.034, 'C', "87") 时,a 被初始化为 123.034b 被初始化为 'C'c 被初始化为 "87"
  3. 独立的内存空间:形参和实参处于两个完全独立的栈空间中,它们是独立的。修改形参的值不会影响实参的值,除非传递的是指针。

2.3 函数调用的过程

当函数被调用时,进程会进行==上下文切换=。函数执行完毕后,控制权返回给调用该函数的位置,继续执行后续代码。
在这里插入图片描述

2.4 局部变量与栈内存

  • 局部变量:在函数体内定义的变量,只在该函数内有效。形参虽然定义在函数参数列表中,但也属于局部变量。
  • 栈内存:用于存储局部变量。每次函数调用时,系统为该函数分配一段栈内存。函数返回后,系统回收这段内存。
2.4.1 局部变量的特点
  1. 局部变量存储在函数的=栈空间中,作用域限于函数内部==。
  2. 不同函数局部变量可以同名,因为它们在内存中是独立的
  3. 函数退出时,局部变量占用的内存被系统回收,因此局部变量也称为临时变量
2.4.2 栈内存的特点
  1. 分配与释放:函数调用时,系统分配栈内存;函数返回时,系统回收栈内存。
  2. 增长方向:栈内存从高地址向低地址增长。
  3. 内存限制:栈空间相对较少,不建议存储大量数据。

在这里插入图片描述

2.5 示例代码

以下是一个简单的函数示例,演示实参和形参的关系,以及局部变量在栈内存中的使用。

#include <stdio.h>// 函数定义
void swap(int a, int b) {int temp = a;a = b;b = temp;printf("Inside swap function: a = %d, b = %d\n", a, b);
}int main() {int x = 5;int y = 10;printf("Before swap: x = %d, y = %d\n", x, y);swap(x, y);printf("After swap: x = %d, y = %d\n", x, y);  // x 和 y 的值不会改变return 0;
}

解释:

  1. swap 函数定义了两个形参 ab,并交换它们的值。
  2. main 函数中,swap 被调用,并传入 xy 作为实参。
  3. swap 函数内部的 abxy 的副本,修改 ab 不会影响 xy
  4. 函数调用结束后,xy 的值保持不变,因为 swap 函数操作的是局部变量。

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

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

相关文章

Faster-RCNN基本思想和网络结构

简单来说&#xff0c;Faster RCNN RPN Fast RCNN RPN 是指 Region Proposal Network&#xff0c;建议区域生成网络。 Faster RCNN 中用 RPN 来代替了 Fast RCNN 中的SS算法。 算法流程&#xff1a; &#xff08;1&#xff09;将图像输入CNN网络得到相应的特征图。 &#x…

多态、虚函数表与动态绑定的深入解析

目录 多态简介 虚函数表与动态绑定 虚函数表 动态绑定机制 内存与性能影响 纯虚函数与抽象类 纯虚函数 抽象类 动态类型转换与typeid操作符 dynamic_cast typeid操作符 虚析构函数的重要性 在面向对象编程中&#xff0c;多态性是一种核心特性&#xff0c;它允许我们…

单机多卡分布式训练策略——MirroredStrategy

前言 分布式训练是一种用于在多个设备或机器上同时训练深度学习模型的技术&#xff0c;它有助于减少训练时间&#xff0c;允许使用更多数据更快训练大模型。分布式训练重点关注数据并行性&#xff0c;本次试验使用的是单机多卡的分布式训练策略&#xff0c;也就是 MirroredStr…

mvn install -DskipTests

mvn install -DskipTests mvn install -DskipTests 不用做测试的打包代码

Task vs Thread

C#中的Task和Thread都是用于实现多线程和并发操作的重要组件&#xff0c;但它们在设计哲学、使用场景和功能特性上存在显著差异&#xff0c;同时也有一些内在的联系。 Task vs Thread 设计理念: Thread: 是操作系统级别的资源&#xff0c;代表了独立的执行路径。它是较为底层…

算法题目学习汇总

1、二叉树前中后序遍历:https://blog.csdn.net/cm15835106905/article/details/124699173 2、输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点&#xff0c;只能调整树中结点指针的指向。 public class Solution {private Tr…

多模态AI的挑战与早期壁垒的构建

伴随着Sora、GPT40的推出&#xff0c;多模态AI逐渐成为研究的热点和应用的趋势。然而&#xff0c;多模态AI的发展并非一帆风顺&#xff0c;它面临着诸多挑战和壁垒。 一、多模态AI的难点 多模态AI的核心在于将不同模态的信息&#xff08;如文本、图像、音频、视频等&#xff…

离线翻译器下载哪个好?这几个翻译器用过的人都说好

面对跨文化交流的挑战&#xff0c;如国际旅行或多元工作环境&#xff0c;语言障碍尤为突出。 特别是在信号弱或无网络覆盖的地区&#xff0c;翻译需求变得更加迫切。此时&#xff0c;一款优质的离线翻译app显得尤为重要。它能够在没有网络支持的情况下提供即时翻译服务&#x…

事实与价值很难对齐的原因

事实与价值的对齐是一个复杂的问题&#xff0c;因为事实通常是客观的、可观察的和基于证据的&#xff0c;而价值则是主观的、个人的和基于信仰或偏好的。事实与价值很难对齐的原因有以下几点&#xff1a; 1、事实的客观性和价值的主观性 事实是客观存在的&#xff0c;而价值则是…

空间数字孪生及应用

空间数字孪生&#xff08;SDT&#xff09;本质上是现实世界地理空间对象&#xff08;例如&#xff0c;建筑物、道路&#xff09;和系统&#xff08;例如&#xff0c;环境或交通监控&#xff09;的镜像表示。地理空间协会正式定义SDT为具有精确位置和维度属性的虚拟表示&#xf…

CF297C Splitting the Uniqueness 题解

CF297C Splitting the Uniqueness 题解 非常好构造题&#xff0c;使我的草稿纸旋转。 解法 我们记输入的数组为 a a a&#xff0c;需要输出的两个数组为 b , c b,c b,c&#xff08;因为当时起变量名起的&#xff09;。 考虑利用 a i a_i ai​ 互不相同的性质。 先将 a…

二叉树顺序结构——堆的结构与实现

二叉树顺序结构——堆的结构与实现 一、二叉树的顺序结构二、堆的概念及结构三、堆的实现堆向下调整算法堆的创建建堆时间复杂度堆的插入(堆向上调整算法)堆的删除堆的代码实现(使用VS2022的C语言)初始化、销毁构建、插入、删除返回堆顶元素、判空、返回有效元素个数 四、完整 …

20240610 基于QGIS生成地区示意图的地图shp文件

目录 本文目标前置条件具体步骤1. 创建Project2. 插入世界地图3. 对地区示意图进行地理匹配4. 创建shp文件&#xff0c;勾画轨迹 注意事项 本文目标 基于QGIS生成地区示意图的地图shp文件&#xff0c;此shp文件可以用来学习&#xff0c;但是未经审批不可用于发表。 前置条件 …

Python基础教程(十一):数据结构汇总梳理

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

10.3 Go 同步与通信

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Android Studio Jellyfish版本修改project使用特定jdk版本的步骤

android studio总是把这些东西改来改去让人十分恼火&#xff0c;IDE本身改来改去就让人无法上手就立即工作&#xff0c;很多时间浪费在IDE和gradle的配置和奇奇怪怪现象的斗智斗勇上&#xff0c;搞Android是真的有点浪费生命。一入此坑深不见底 jellyfish版安卓studio已经无法通…

算法 | 剪枝函数以及几种形式回溯法和分支限界法的区别算法特性分支限界法的思想分支限界法的基本步骤Prim和Kruscal回溯法的效率

what is 剪枝函数&#xff1f; 是对该问题能否得到最优解或者可行解的约束 限界函数&#xff1a;最优解 约束函数&#xff1a;可行解 回溯法和分支限界法的区别&#xff1a; 异&#xff1a; 回溯法分支限界法一次生成/扩展一个结点一次生成所有的孩子结点BFSDFS/最小耗费优…

Docker高级篇之轻量化可视化工具Portainer

文章目录 1. 简介2. Portainer安装 1. 简介 Portianer是一款轻量级的应用&#xff0c;它提供了图形化界面&#xff0c;用于方便管理Docker环境&#xff0c;包括单机环境和集成环境。 2. Portainer安装 官网&#xff1a;https://www.portainer.io 这里我们使用docker命令安装&…

深入探讨API接口:定义、作用、设计原则及常见问题

API&#xff08;Application Programming Interface&#xff09;即应用程序编程接口&#xff0c;是软件系统间相互通信的桥梁&#xff0c;提供了一系列的约定和工具&#xff0c;使不同软件系统之间能够实现数据交换和功能调用。在软件开发中&#xff0c;API接口扮演着至关重要的…

渗透测试之内核安全系列课程:Rootkit技术初探(一)

今天&#xff0c;我们来讲一下内核安全&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 目前&#xff0c;在渗透测试领域&#xff0c;主要分为了两个发展方向&#xff0c;分别为Web攻防领域和PWN&#xff08;二进制安全&#xff09;攻防领域。在…