C语言函数

1.函数是什么

在数学里,函数是一种对应关系,而 C 语言里的函数和数学中的函数具有相似点,但是有很大的不同,甚至有些人认为“函数”这个名词不够恰当。准确来说,C 函数的函数是一种子程序,您可以去 Wiki 百科查看对子程序的解释。

所谓的子程序,实际上就是大型程序中的某部分子代码。子程序本身由一个或多个语句组成,负责完成某项特定的任务,而且相较于其他代码具有相对的独立性。

可以认为,程序员在实践中,发现某一段代码也就是子程序经常被反复使用,因此就将这段代码摘取出来,给其进行命名做标记。而后续编码过程中,如果需要使用这段代码,就只需要调用对应的命名标记即可。

//计算算式 (x + y) / 3 - z 的结果
#include <stdio.h>
int main()
{int val1 = (1 + 2) / 3 - 4;printf("%d\n", val1);int val2 = (6 + 3) / 3 - 5;printf("%d\n", val2);int val3 = (-3 + 4) / 3 - 7;printf("%d\n", val3);return 0;
}

可以看到,我们反复使用下面这段子代码:

//提炼出子代码
#include <stdio.h>
int valn = (x + y) / 3 - z;
printf("%d\n", valn);

如果需要计算的次数变多,就会重复写上述的子代码,这样做的效率实在太低,因此我们把子代码摘取出来,给予一个标记/函数名作为子代码的命名,这个过程也被称为“封装”。

//把子代码封装为函数
#include <stdio.h>
void Function(int x, int y, int z)
{int valn = (x + y) / 3 - z;printf("%d\n", valn);
}

那怎么调用呢?看下面代码:

//把子代码封装为函数
#include <stdio.h>
void Function(int x, int y, int z) //接受三个参数拿去计算并且输出结果
{int valn = (x + y) / 3 - z;printf("%d\n", valn);
}//计算算式 (x + y) / 3 - z 的结果
int main()
{//int val1 = (1 + 2) / 3 - 4;//printf("%d\n", val1);Function(1, 2, 4); //传递三个参数交给函数去计算//int val2 = (6 + 3) / 3 - 5;//printf("%d\n", val2);Function(6, 3, 5); //传递三个参数交给函数去计算//int val3 = (-3 + 4) / 3 - 7;//printf("%d\n", val3);Function(-3, 4, 7); //传递三个参数交给函数去计算return 0;
}

这样就简化了 main() 函数内冗余的代码。

吐槽:不过函数这个名字实际上我感觉也没错,上述例子中的确是进行了输入和输出,看上去也挺像数学里的函数或方程…

这里强调一点,使用函数时也是需要使用空间的,这类似创建变量需要有空间存储变量的值一样,函数在运行过程中也需要一定的空间资源,而这份空间也被叫做栈区,您简单理解一下就行。

2.函数的传参

实际参数 就是真实传给函数的参数,实参可以是常量、变量、表达式、函数返回值…在进行函数调用的时候,必须先有实际参数调用函数,然后再传值/拷贝给函数的 形式参数,在函数体内部进行使用。

补充:“传值”这个词,在计算机中很多时候都是“拷贝”的代名词…

而简单来讲:

  • 函数调用后,函数名后面括号的内容中的量就是实际参数
  • 函数定义后,函数名后面括号的内容中的变量就是形式参数
//区分实参和形参
#include <stdio.h>
void Func(int x) //这里的 x 就是形式参数
{printf("%d\n", x);
}int main()
{int t = 0;Func(t); //这里的 t 就是实际参数Func(2); //这里的 2 就是实际参数return 0;
}

只有在函数被调用的时候,实参传值给形时,形参才会有值(即“才会实例化“)此时该变量才会分配内存单元,拷贝一份实参的值来使用。

而由于“形参”是“实参”的一份临时拷贝,因此对形参的任何修改是不会影响到实参的。这样就会造成一些坑。

//使用传值的交换函数
#include <stdio.h>
void Swap(int x, int y) //用于交换两个数的函数
{printf("x=%d y=%d\n", x, y); //打印检查是否有发生交换int temp = x; //先存储一份 x, 避免 x 原本的值丢失x = y;y = temp;printf("x=%d y=%d\n", x, y); //打印检查是否有发生交换
}int main()
{int a = 1;int b = 2;printf("a=%d b=%d\n", a, b); //打印检查是否有发生交换Swap(a, b); //尝试交换两个变量中的值printf("a=%d b=%d\n", a, b); //打印检查是否有发生交换return 0;
}

我们会发现,ab 变量内的值确实没有发生交换,但是函数体内的形参却做了交换,但是这个交换结果没有影响到身为实参的 ab 变量。因此,如果我们需要通过形参来改动实参,则不能只是传递值,而是应该传递实参的地址!

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

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

相关文章

[linux] pytorch各种报错

1. matplot lib "fatal IO error 25 (Inappropriate ioctl for device) on X server “localhost:10.0” 解决方案&#xff1a; import matplotlib matplotlib.use(Agg) 2. Error ALSA Carla 0.9.9 报错信息为&#xff1a; 4.24.3-0UE4Release-4.24 518 0 Disabling c…

暗区突围pc端资格发放了吗 暗区突围pc测试资格怎么获取

暗区突围pc端资格发放了吗 暗区突围pc测试资格怎么获取 暗区突围是一款很火爆的第一人称射击网游&#xff0c;现在终于要上线PC端啦&#xff01;小伙伴们是不是已经迫不及待想要体验电脑上的硬核射击快感了&#xff1f;暗区突围pc端资格已经陆续发放&#xff0c;想要参与PC端…

TC8002D 是一颗带关断模式的音频功放IC

一、一般概述 TC8002D是一颗带关断模式的音频功放IC。在5V输入电压下工作时&#xff0c;负载(3Ω)上的平均功率 为3 W&#xff0c;且失真度不超过10%。而对于手提设备而言&#xff0c;当VDD作用于关断端时&#xff0c;TC8002D将会进入关断模式&#xff0c;此时的功耗极…

Redis的几种集群模式

主从复制模式&#xff1a; 主从复制是Redis最简单的集群模式。这个模式主要是为了解决单点故障的问题&#xff0c;所以将数据复制多个副本中&#xff0c;这样即使有一台服务器出现故障&#xff0c;其他服务器依然可以继续提供服务。数据会在一个主节点&#xff08;master&#…

TypeScript综合练习2(文本处理)

Text Processor You’ll practice creating and transforming arrays of strings. Hello, fellow text editing and type setting enthusiast! I hear you have a dual interest in both TypeScript and and type scripts. That’s great because I have a few projects for yo…

探索淘宝API接口对接(属性规格丨sku价格丨详情图丨优惠券等):打造智能电商解决方案

一、引言 随着电子商务的快速发展&#xff0c;越来越多的企业和开发者希望通过自动化和智能化的方式接入电商平台&#xff0c;以实现更高效的数据交互和业务流程。淘宝作为中国最大的电商平台之一&#xff0c;其提供的API接口成为了众多企业和开发者关注的焦点。本文将探讨淘宝…

【spring】Bean的生命周期回调函数和Bean的循环依赖

目录 1、Bean的生命周期 2、Bean的生命周期回调函数 2.1、初始化的生命周期回调 2.2、销毁的生命周期回调 3、Bean的循环依赖 1、Bean的生命周期 spring的bean的生命周期主要是创建bean的过程&#xff0c;一个bean的生命周期主要是4个步骤&#xff1a;实例化&#xff0c;…

视频剪辑图文实例:一键操作,轻松实现视频批量片头片尾减时

视频剪辑是现代媒体制作中不可或缺的一环&#xff0c;而批量处理视频更是许多专业人士和爱好者的常见需求。在剪辑过程中&#xff0c;调整视频的片头片尾时长可以显著提升视频的质量和观感。本文将通过图文实例的方式&#xff0c;向您展示如何一键操作&#xff0c;轻松实现视频…

直播录屏怎么录?分享3种方法

随着网络直播的兴起&#xff0c;直播录屏已成为众多网友记录精彩瞬间、分享有趣内容的重要工具。直播录屏不仅能帮助我们回顾和保存直播中的精彩片段&#xff0c;还能为创作者提供更多的素材和灵感。 本文将为大家介绍3种直播录屏的方法&#xff0c;帮助大家能够更好地利用这一…

【IEEE独立出版|往届均已成功检索】ISPDS 2024诚邀投稿参会

第五届信息科学与并行、分布式处理国际学术会议&#xff08;ISPDS 2024&#xff09; 2024 5th International Conference on Information Science, Parallel and Distributed Systems 2024年5月31-6月2日 | 中国广州NEWS&#xff1a;会议已在格林威治大学官网上线会议已经上线到…

配置Socks5代理的詳細步驟

Socks5代理的主要優點是它能夠處理任何類型的網路流量&#xff0c;包括Web流覽、電子郵件、檔傳輸等。 運行Socks5代理服務的伺服器&#xff0c;可以是一臺物理伺服器&#xff0c;也可以是一臺虛擬私有伺服器。 其次&#xff0c;我們需要在伺服器上安裝Socks5代理軟體。常用的…

学术咸鱼入门指南(2)

巧用思维导图阅读文献 化整为零&#xff1a;读文献&#xff0c;从拆分文章的结构开始 大家在初步接触自己学科的论文时&#xff0c;要了解清楚基本的范式&#xff0c;日后读起来就比较顺了。 科研论文的第一部分&#xff0c;是文章的标题&#xff0c;摘要和关键词&#xff0…

【MySQL】连接查询(JOIN 关键字)—— 图文详解:内连接、外连接、左连接、左外连接、右连接、右外连接

文章目录 连接查询驱动表连接查询分类 内连接&#xff08;INNER JOIN&#xff09;内连接 —— 等值连接内连接 —— 自然连接&#xff08;NATURAL JOIN&#xff09;内连接 —— 交叉连接&#xff08;笛卡尔积&#xff09; 外连接&#xff08;OUTER JOIN&#xff09;外连接 ——…

nodejs里面的 http 模块介绍和使用

Node.js的HTTP模块是一个核心模块&#xff0c;它提供了很多功能来创建HTTP服务器和发送HTTP请求。 http.Server是一个基于事件的http服务器&#xff0c;内部是由c实现的&#xff0c;接口是由JavaScript封装。 http.request是一个http客户端工具。 用户向服务器发送数据。 创…

范式的知识点

A. 有关“键”的概念 1) 超键&#xff1a;在关系中能唯一标识元组的属性或属性集称为关键模式的超键。 2) 候选键&#xff1a;不含有多余属性的超键称为候选键。也就是在候选键中在删除属性就不是键了。 3) 主键&#xff1a;用户选作元组标识的候选键称为主键。一般…

嵌入式RTOS面试题目

用过哪些嵌入式操作系统&#xff1f;使⽤RTOS和裸机代码开发有什么区别&#xff08;优缺点&#xff09;&#xff1f; 之前的⼀个项⽬是采⽤裸机代码开发的&#xff0c;写起来还⾏&#xff0c;通过状态机来管理业务逻辑和各种外设。 但是随着外设的增加&#xff0c;任务之间的…

C++学习笔记2

T1 奇怪的教室 题目背景 LSU 的老师有个奇怪的教室&#xff0c;同学们会从左到右坐成一个横排&#xff0c;并且同一个位置可以坐多个同学。这天&#xff0c;入学考试的成绩下来了。同学们想根据入学考试的成绩&#xff0c;找出班里学霸扎堆的区域“学霸区”。 题目描述 共有…

CSDN我的创作纪念日128天||不忘初心|努力上进|勇往直前

机缘 Hello&#xff0c;大家好&#xff0c;我是景天&#xff0c;其实很早之前我就加入到了CSND的大军&#xff0c;但那是我还是个小白&#xff0c;经常回来CSND汲取养料&#xff0c;就这样慢慢的来提升自己&#xff0c;强大自己。经过多年的学习&#xff0c;积累与总结&#x…

Davinci工程开发方法论

基本概念 Flash Driver是下载到RAM里面的bin文件 Boot Manager是ROM上启动运行的第一个实例&#xff0c;可以是独立的bin文件&#xff0c;可以是集成在FBL里面。 Bootloader存储在ROM里面的bin文件 Demo Appl一个示例模板&#xff0c;用来跳转到Bootloader的&#xff0c;也是一…

本地的git仓库和远程仓库

文章目录 1. 远程创建仓库2. 关联远程和本地代码3. 推送本地分支到远程 1. 远程创建仓库 2. 关联远程和本地代码 上面创建完后会得到一个git仓库的链接&#xff0c;有SSH或者http的 http://gitlab.xxxxx.local:18080/xxxxx/dvr_avm.git ssh://gitgitlab.xxxxx.local:10022/xx…