当前位置: 首页 > news >正文

C语言——函数

导读 :

这篇文章主要讲解一下C语言函数的一些基本知识。

前言:函数的概念

C语言中的函数又常常被称为子程序,是用来完成某项特定的工作的一段代码。就像我们生活中的模块化建造技术,类比模块化建房子的过程:整个程序好比最终要建成的房子,而函数所代表的就是每部分模块(如第一层,第二层或者屋顶···),将这些模块灵活的拼接,就搭建成了最后的房子。

从函数的定义角度:我们可以把函数分为库函数自定义函数

一,库函数:

库函数是由C语言编译系统提供的,已经有一定功能的,我们只需在程序前包含有该函数原型的头文件就可以直接使用这些函数。

比如我们常用的 printf函数

#include<stdio.h>        //  <stdio.h>就是包含printf函数的头文件 

int main ()

{

   printf("yeah");  //  printf就是C语言提供的有打印功能的库函数,不需要我们自己定义

}

 寻找C中的库函数及其有关的头文件的网址(C/C++官方的链接):

http://zh.cppreference.com/w/c/header

二,自定义函数:

是由用户根据需要自行编写的函数,创建格式如下:

ret_type name(形式参数)

{

    函数体(用来描述函数执行过程的部分)

}

创建例子:

#include<stdio.h>     //int 决定了z的返回类型是整形

int plus(int x,int y)    //plus是函数名  //int x,int y规定了输入的形式参数的类型应该是整形

{

    int z = 0;  

    z = x + y;

    return z;
}

这个函数的作用就是计算两数之和。

写好这个函数以后,若调用这个函数,函数就会计算所输入的两个值之和,然后返回给主调函数

知识点:

(1)ret_type(返回类型)

ret_type指返回类型(即函数计算结果的类型,如:int 、double···;也可以是void,表示什么都不返回

· 下面对函数的返回值进行解释说明:

从是否有返回值的情况,函数可分为:有返回值函数无返回值函数

有返回值函数:这类函数在执行完以后,会通过return语句向调用者返回一个执行结果

无返回值函数:这类函数只是把函数体执行完,然后继续执行程序后面的语句,并不会向调用者返回任何值

(2) return语句

功能:计算表达式的值,并返回给主函数

① return语句后面可以是数值也可以是表达式,如果是表达式,则先计算表达式,再返回

② 若return语句返回的值和函数的返回类型不一样,系统会将返回的值转换成函数的返回类型

③ return语句执行后,函数是彻底返回(不会在执行后面的语句)

④ 当函数存在分支语句,则要保证每种情况下都有return返回

⑤ 当返回类型是void这种不需要返回的,可以省略return,或者return语句后面不跟表达式

(3)形式参数和实际参数

形式参数:是在定义函数时确定的,只能是变量,只有在被调用时才分配内存单元,在调用结束后,立刻释放所分配的内存单元

实际参数:可以是常量,变量,表达式,函数值等。在函数调用时,它们必须要有确定的值,以便把这些值传递给形参

实参数值的传递要注意:

1,实参和形参在数量上,顺序上要严格保持一致

2,实参和形参的数据类型必须兼容,并且以形参的数据类型为主

关于形参内存分配的理解:

请看下面的代码:

函数swap的作用是交换a,b的值,可是为什么最后打印出的结果却还是10,20呢?

这里我们就要理解一下形参的内存分配和实参的内存分配的区别:

(1)int a,b时:a,b作为实参在创建时是直接分配了内存空间

(2)到调用 swap(a,b)这时候是实参a,b的值传递给形参(也就是传递给函数()里面 的变量),形参得到值才会分配新的空间,并且这个内存空间和函数外实参的空间是不一样的

(3)最后在函数执行完以后形参a,b的内存空间被释放

所以,从始至终,函数并没有对函数外的实参进行操作,函数改变的只是附有实参的数值的形参

三,函数的调用

我们继续用这个图来解释:

调用格式

函数名(实际参数列表);   //分号不能省

如上图,调用swap函数:

   swap(a,b);

说明:

1,无参数函数调用时,没有实参列表

2,实参列表中的参数(即实参)可以是变量,常量和表达式

3,实参之间用逗号隔开

4,在C语言中,出了main函数,其余的函数调用前要有函数声明(原型)

函数声明

 ret_type name(形式参数);

如上图若要声明swap函数:

  void swap(int x,int y);

注意:上图中使用swap函数时没有声明是因为:上述的程序中函数的实现在前,而函数的实现属于特殊的声明

函数的嵌套调用

C语言中的函数之间都是平行的,不分上下级。因此不能在一个函数里定义另一个函数,但是可以在定义函数的时候调用其他函数

下面对函数的嵌套调用进行举例:

这个程序中有三个函数main(),fac(),comb(),他们之间的嵌套关系如下:

在main函数中调用了comb函数来进行分式计算;在comb函数中又调用了fac函数来计算n!,m!和(n-m)!


时光总是这么快,一下就看到结尾啦!

🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!

嘿嘿,王子,公主请一键三连!(✪ω✪)

感谢大家的观看和支持!最后,☺祝愿大家天天开心!!!

           开心是一天,不开心也是一天,为什么不开开心心的过好每一天呢!!! 

相关文章:

C语言——函数

导读 &#xff1a; 这篇文章主要讲解一下C语言函数的一些基本知识。 前言&#xff1a;函数的概念 C语言中的函数又常常被称为子程序&#xff0c;是用来完成某项特定的工作的一段代码。就像我们生活中的模块化建造技术&#xff0c;类比模块化建房子的过程&#xff1a;整个程序…...

DDR SDRAM 学习笔记

一、基本知识 1.SDRAM SDRAM : 即同步动态随机存储器&#xff08;Synchronous Dynamic Random Access Memory&#xff09;, 同步是指其时钟频率与对应控制器&#xff08;CPU/FPGA&#xff09;的系统时钟频率相同&#xff0c;并且内部命令 的发送与数据传输都是以该时钟为基准…...

RocketMQ(4.9.4)学习笔记 - 安装部署

单机部署&#xff1a; 官网文档地址&#xff1a; https://rocketmq.apache.org/zh/docs/4.x 参考文档&#xff1a; windows安装RocketMQ_rocketmq windows_book多得的博客-CSDN博客 下载地址&#xff1a; https://archive.apache.org/dist/rocketmq/4.9.4/rocketmq-all-4.9.…...

虚拟局域网

虚拟局域网(VLAN) VLAN建立于交换技术的基础之上 广播域(broadcast domain)&#xff1a;其中任何一台设备发出的广播通信都能被该部分网络中的所有其他设备所接收&#xff0c;这部分网络就叫广播域利用以太网交换机可以很方便地实现虚拟局域网VLAN(Virtual LAN)对于一个主机和…...

【PG】PostgreSQL 预写日志(WAL)、checkpoint、LSN

目录 预写式日志&#xff08;WAL&#xff09; WAL概念 WAL的作用 WAL日志存放路径 WAL日志文件数量 WAL日志文件存储形式 WAL日志文件命名 WAL内容 检查点&#xff08;checkpoint&#xff09; 1 检查点概念 2 检查点作用 触发检查点 触发检查点之后数据库操作 设置合…...

一文了解VR全景拍摄设备如何选择,全景图片如何处理

引言&#xff1a; 在如今的数字化时代&#xff0c;虚拟现实&#xff08;VR&#xff09;技术不仅为我们的生活增添了许多乐趣&#xff0c;也为摄影领域带来了新的摄影方式&#xff0c;那么VR全景拍摄如何选择设备&#xff0c;全景图片又怎样处理呢&#xff1f; 一. VR全景拍摄设…...

Linux下docker安装mysql8.0

下载mysql8.0docker镜像 docker pull mysql:8.0 查看下载的docker镜像 docker images创建挂载目录 mkdir -p /data/mysql/conf mkdir -p /data/mysql/data mkdir -p /data/mysql/logs运行 docker run -p 3306:3306 --name mysql --restartalways --privilegedtrue \ -v /da…...

C++ std::make_unique和std::make_shared用法

std::make_unique 和 std::make_shared 是 C++11 引入的两个辅助函数,用于创建动态分配的智能指针 std::unique_ptr 和 std::shared_ptr,分别帮助避免了显式使用 new 和 delete,从而提高代码的安全性和可读性。 std::make_unique: #include <memory>int main() {// …...

【Redis】list列表

上一篇&#xff1a; String 类型 https://blog.csdn.net/m0_67930426/article/details/134362606?spm1001.2014.3001.5501 目录 Lpush LRange Rpush Lpop Rpop Lindex Ltrim Lset 列表不存在的情况 如果列表存在 Linsert ​编辑 在………之前插入 在……后面插入…...

树莓派安装ubuntu系统

准备工作&#xff1a; 1.树莓派官方烧录工具&#xff0c;raspberry pi imager下载链接Raspberry Pi OS – Raspberry Pi 2.下载ubuntu镜像文件&#xff0c;下载链接Install Ubuntu on a Raspberry Pi | Ubuntu 打开imager软件&#xff0c;操作系统选择自定义镜像&#xff0c;…...

绩效管理系统有哪些?

绩效管理系统有哪些&#xff1f; 把绩效管理系统按照两大指标分类—— 按地域划分&#xff08;主要看兼容性和稳定性&#xff09;按照功能性质划分&#xff08;主要看实用性和拓展性&#xff09; 按照以上两个维度&#xff0c;我们可以简单把绩效管理系统分为4大不同类型——…...

Three.js学习记录

下载并安装...

CTFhub-RCE-远程包含

给咱一个phpinfo那么必然有他的道理 PHP的配置选项allow_url_include为ON的话&#xff0c;则include/require函数可以加载远程文件&#xff0c;这种漏洞被称为"远程文件包含漏洞(Remote File Inclusion RFI)"。 allow_url_fopen On 是否允许打开远程文件 allow_u…...

云流量回溯的重要性和应用

云流量回溯是指利用云计算和相关技术来分析网络流量、数据传输或应用程序操作的过程。这个过程包括了对数据包、通信模式和应用程序性能的审查和跟踪。本文将介绍云流量回溯重要性和应用! 1、网络安全: 云流量回溯是网络安全的重要组成部分。通过监测和回溯网络流量&#xff0c…...

JVM之垃圾回收

1. 如何判断对象可以回收 1.1 引用计数法 引用计数法是一种内存管理技术&#xff0c;其中每个对象都有一个与之关联的引用计数。引用计数表示当前有多少个指针引用了该对象。当引用计数变为零时&#xff0c;表示没有指针再指向该对象&#xff0c;该对象可以被释放&#xff0c…...

人工智能基础_机器学习026_L1正则化_套索回归权重衰减梯度下降公式_原理解读---人工智能工作笔记0066

然后我们继续来看套索回归,也就是线性回归,加上了一个L1正则化对吧,然后我们看这里 L1正则化的公式是第二个,然后第一个是原来的线性回归,然后 最后一行紫色的,是J= J0+L1 对吧,其实就是上面两个公式加起来 然后我们再去看绿色的 第一行,其实就是原来线性回归的梯度下降公式…...

ubuntu xrdp远程登录一直弹出Authentication required. System policy prevents WiFi scans

windows远程登录以后想要连接一下wifi&#xff0c;一定弹出Authentication required&#xff0c;关都关不掉&#xff0c;wifi也连不上。 使用以下方法后完美解决 sudo vi /etc/polkit-1/localauthority/50-local-d/network.pkla 加入如下内容&#xff1a; [Allow Wifi Scan…...

【Python】基础练习题_ 函数和代码复用

&#xff08;1&#xff09;编写一个函数&#xff0c;输入n为偶数时&#xff0c;调用函数求1/21/4…1/n,当输入n为奇数时&#xff0c;调用函数1/11/3…1/n。 def calculate_sum(n):total_sum 0if n % 2 0: # n为偶数for i in range(2, n1, 2):total_sum 1 / ielse: # n为奇…...

Java中的ClassLoader是什么?有哪些常见的ClassLoader?

在Java中&#xff0c;ClassLoader是一个抽象类&#xff0c;它的主要任务就是将class文件加载到JVM虚拟机中去以便程序可以正确运行。一般来说&#xff0c;Java程序在编写完成后是以.java的文件存在磁盘上&#xff0c;然后通过编译器将其编译成.class文件&#xff08;字节码文件…...

vim批量多行缩进调整

网上其他教程&#xff1a; ctrl v 或者 v进行visual模式按方向键<&#xff0c;>调整光标位置选中缩进的行Shift > &#xff08;或者 Shift < &#xff09;进行左右缩进。 我只想说&#xff0c;乱七八糟&#xff0c;根本不管用 本文教程&#xff1a; 增加缩进…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...