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 函数操作的是局部变量。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多点液位传感器如何实现连续液位检测

如今&#xff0c;随着液位传感器的不断发展与演进&#xff0c;多点液位传感器也应用而生&#xff0c;可以实现对液体在多个连续点位的精确检测与监控&#xff0c;在洗地机设备上&#xff0c;可以及时了解水量&#xff0c;避免水资源浪费等情况。 多点式光电液位传感器采用了先…

测试记录4:在windows wsl2上配置ubuntu20.04

1.下载ubuntu20.04 (1) 在microsoft store中下载ubuntu20.04 (2) 在powershell中检查ubuntu20.04 wsl --listwsl -l -v安装成功 2.安装界面 见测试记录3 3.安装必要的功能包 sudo apt install zip sudo apt install gedit4.安装ros2 wget http://fishros.com/install -O …

提升你的编程体验:自定义 PyCharm 背景图片

首先&#xff0c;打开 PyCharm 的设置菜单&#xff0c;点击菜单栏中的 File > Settings 来访问设置&#xff0c;也可以通过快捷键 CtrlAItS 打开设置。 然后点击Appearance & Behavior > Appearance。 找到Background image...左键双击进入。 Image:传入自己需要设置…

蓝卓为中小制造企业注入数字化转型活力

随着劳动力成本上升,原材料价格上涨,企业生产成本逐年增加&#xff0c;市场竞争越来越激烈&#xff0c;传统的中小制造企业面临着巨大的压力。 通过数字化转型应对环境的变化已成为行业共识&#xff0c;在数字化的进程中&#xff0c;中小企业首要考虑生存问题&#xff0c;不能…

什么是场外期权?场外期权有几种做法?

今天带你了解什么是场外期权&#xff1f;场外期权有几种做法&#xff1f;期权分为场内期权&#xff0c;场外期权。场内期权我们都知道&#xff0c;是在期货盘里购买的期权&#xff0c;但场外期权呢&#xff1f; 什么是场外期权&#xff1f; 场外期权是一种在交易所之外进行交易…

数据结构和矩阵细节用法:double、cell和complex #matlab

矩阵建立 建立矩阵用[]&#xff1b; 矩阵的同一行内的元素用逗号或者空格隔开&#xff1b; 矩阵的不同行的元素用分号隔开 eg. 矩阵 A 1 2 3 4 5 6 7 8 9 在matlab中矩阵A表示为&#xff1a; clc;clear; A[1,2,3;4,5,6;7,8,9]; %或者A[1 2 3;4 5 …

helm升级部署时出现升级挂起状态处理

问题 在使用helm 升级命令时&#xff0c;升级命令如下&#xff1a; helm upgrade -i -f ./values-prod.yaml myapp ./ -n myns --create-namespace中途因为网络原因&#xff0c;再次运行上面升级命令时出现&#xff0c;如下错误&#xff1a; Error: UPGRADE FAILED: another …

《数据结构》

简答题 一、设散列函数H(key)=key MOD 11,用线性探测再散列法解决冲突。对关键字序列{ 13,28,72,5,16,18,7,11,24 }在地址空间为0-10的散列区中建散列表,画出此表,并求等概率情况下查找成功时的平均查找长度。 散列函数为 H(key)=key MOD 11,将关键字序列 {13,28,…

【数据结构】【版本1.1】【线性时代】——单链表

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、顺序表的问题二、链表的概念三、单链表的模拟实现3.1 定义3.2 打印3.3 创建新节点3.4 头插3.5 尾插3…

Android MediaMetadataRetriever获取视频宽高,Java

Android MediaMetadataRetriever获取视频宽高&#xff0c;Java public static int[] getVideoSize(Context ctx, Uri uri) {MediaMetadataRetriever retriever new MediaMetadataRetriever();int[] size {-1, -1}; //宽&#xff0c;高try {retriever.setDataSource(ctx, uri)…

JVC摄像机SD卡变成RAW的恢复方法

JVC小日本胜利公司&#xff0c;公司名字绕口且产品线极广&#xff0c;涉及汽车、影音、娱乐……&#xff0c;而JVC在摄像机产品方面也有涉及&#xff0c;不过市场上极为少见。下边我们来看下这个JVC摄像机MP4恢复案例。 故障存储: 32G存储卡 RAW文件系统 故障现象: 客户无…

Linux Radix tree简介

文章目录 前言一、Radix tree简介二、Operations2.1 Lookup2.2 Insertion2.3 Deletion 三、Linux内核API3.1 初始化3.2 radix_tree_insert/delete3.3 radix_tree_preload3.4 radix_tree_lookup3.5 radix_tree_tag_set3.6 radix_tree_tagged 四、address_space4.1 简介4.2 相应数…

新一代大核卷积反超ViT和ConvNet!同参数量下性能、精度、速度完胜

大核卷积网络是CNN的一种变体&#xff0c;也是深度学习领域的一种重要技术&#xff0c;它使用较大的卷积核来处理图像数据&#xff0c;以提高模型对视觉信息的理解和处理能力。 这种类型的网络能够捕捉到更多的空间信息&#xff0c;因为它的大步长和大感受野可以一次性覆盖图像…

34万汉语词语成语反义词ACCESS\EXCEL数据库

反义词就是两个意思相反的词&#xff0c;包括&#xff1a;绝对反义词和相对反义词。分为成对的意义相反、互相对立的词。如&#xff1a;真——假&#xff0c;动——静&#xff0c;拥护——反对。这类反义词所表达的概念意义互相排斥。或成对的经常处于并举、对待位置的词。如&a…

WinForm之TCP服务端

目录 一 原型 二 源码 一 原型 二 源码 using System.Net; using System.Net.Sockets; using System.Text;namespace TCP网络服务端通讯 {public partial class Form1 : Form{public Form1(){InitializeComponent();}TcpListener listener null;TcpClient handler null;Ne…

记C#优化接口速度过程

前提摘要 首先这个项目是接手的前一任先写的项目&#xff0c;接手后&#xff0c;要求对项目一些速度相对较慢的接口进行优化&#xff0c;到第一个速度比较慢的接口后&#xff0c;发现单接口耗时4-8秒&#xff0c;是的&#xff0c;请求同一个接口&#xff0c;在参数不变的情况下…

如何在CST软件中获得多天线不同频的SAR

之前写过计算SAR的文章&#xff0c;但是没有提到多天线的情况。 仿真实例018&#xff1a;均匀头模型和天线SAR比吸收率仿真案例 CST软件如何用E场计算Loss损耗密度 --- SAR计算加速技巧 这期我们看看多天线不同频率如何计算SAR。 用一个简单的手模型和三个不同长度天线为例&a…

红海云签约盛帆集团,开启多元化集团人力资源数字化新征程

武汉盛帆投资集团股份有限公司&#xff08;以下简称“盛帆集团”&#xff09;是以能源管理产业为根本&#xff0c;以金融投资产业为纽带&#xff0c;以文体产业为拓展方向的多元化集团企业。公司能源管理产业创立于1998年&#xff0c;主要从事智能电表、智能水表、集中器、高压…

学习笔记——网络管理与运维——SNMP(概述)

一、SNMP概述 1、SNMP背景 SNMP的基本思想&#xff1a;为不同种类的设备、不同厂家生产的设备、不同型号的设备&#xff0c;定义为一个统一的接口和协议&#xff0c;使得管理员可以是使用统一的外观面对这些需要管理的网络设备进行管理。 通过网络&#xff0c;管理员可以管理…

NewspaceAi之GPT使用新体验

GPT功能 使用地址&#xff1a;https://newspace.ai0.cn/ 上车 挂挡 踩油门&#xff0c;一脚到底&#xff0c;开始你的表演 问题1&#xff1a;你能做什么详细告诉我&#xff1f; 下面内容是GPT的回答 当然&#xff01;作为一个基于GPT-4架构的AI&#xff0c;我能够在许多方面为…