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

C语言函数是什么?新手必懂的核心概念

被程序或代码引用的一段程序或代码,被称作子程序,它就是函数。

一般而言,一个规模相对较大的程序通常应当分割为若干不同的程序块,每一个程序块专门用以达成一个特定的功能。在所有种类的高级语言当中,均存在子程序这样一个概念,借助子程序来实现程序块所具备的功能。

C语言里,子程序是靠一个主函数跟若干个子函数组成的 ,主函数会调用子函数,子函数之间也能够互相调用 ,同一个函数能够被一个或者多个函数调用随便多少次。

于程序设计里,通常会把一些频繁使用的程序块撰写成函数,放置在函数库当中以供共同使用,用户能够借助这些函数,借此减少重复去编写程序块的工作量。

C语言函数的定义简单来讲,函数是一组执行一个任务的语句,每个C语言程序都必然存在至少一个函数,也就是主函数main(),函数定义会告知编译器函数的返回类型、名称以及参数,函数定义会给出函数的实际主体。

C 语言中函数定义的一般形式如下:

返回值类型 函数名(参数列表) { 函数主体; }

底下讲述一个函数的构成部分,C语言函数于程序里的运用,在程序调用函数之际,程序控制权会转移至被调用的函数。

处于被调用状态的函数,去执行已经设定好的任务。倘若函数的返回语句得以执行,或者抵达函数的结束括号处,此时便会将程序的控制权交还给主程序。

调用函数之际,主程序传递所需之参数,倘若该函数存在返回值,那么便能够把返回值传递给调用此函数的主程序。

1) 要是函数打算使用参数,那么就必定得声明出用于接受参数值的变量,而这些变量就被称作函数之中的形式参数,函数是会有参数的。

函数内的其他局部变量,类似形式参数,进入函数时被创建,退出函数时被销毁。

默认情形下,C程序运用传值调用来传递参数,此方式仅把主程序之中的变量值传递过去,不会对主程序的变量产生改变。

2) 函数定义时的参数表被称作形式参数,也就是简称的形参,它仅仅是对调用函数时参数的个数、类型以及用于引用的名字进行了明确规定,然而却不存在具体的内容。

若形参没有被调用,那么它不会占据存储单元,形参仅仅是在调用的过程当中才占据存储单元。

实际参数也就是被简称为实参的存在,它有着确定下来的数值,在对函数进行调用这个过程当中,实参把所具有的值赋予给形参 ,简单概括而言呀,在函数定义里面,于函数首部位置处的参数被称作形参,而在调用函数的时候所运用的参数被叫做实参,这二者之间所存在的区别以及联系是像下面这样的:

当调用函数时,有两种向函数传递参数的方式,如下表所示。

表:参数传递方式调用类型描述

传值调用

把实参带着的值给予函数所拥有的形参,对函数内部的形参作出修改,并不会对实参(主程序里的变量)产生影响。

引用调用

利用指针传递这种方式,形参是指向主程序里实参的地址,在对形参开展操作之际,也就等于是对实参自身进行操作,这等同于对主程序当中的变量实施操作。

【实例 1】对存储着两个整数的函数里的值采取交换的操作,借助第三个起到临时作用的变量来实现对此两个整数的交换。

#include void swap(int i_a, int i_b) /*函数定义*/ { int temp; temp = i_a; /*保存地址 i_a 的值*/ i_a = i_b; /*把 i_b 赋值给 i_a*/ i_b = temp; /*把 temp 赋值给 i_b*/ return; //该函数无返回值 } int main () { int i_a = 100; int i_b = 200; printf("交换前i_a, i_b 的值: %d, %d\n", i_a, i_b); swap(i_a, i_b); /*调用函数交换值*/ printf("交换后i_a, i_b 的值: %d, %d\n", i_a, i_b); return 0; //也可以写成return (0),即()可省 }

编译运行,结果如下:

交换前i_a, i_b 的值: 100,200

交换后i_a, i_b 的值: 100,200

程序于调用子函数之际,会再度开辟内存空间给 i_a、i_b,还会把实参的值复制进 i_a、i_b 之中,之后于 swap() 函数里,i_a、i_b 的值确实产生了交换情况,可这跟主程序里的 i_a、i_b 没有丝毫关联,i_a、i_b 并未出现任何变化。子函数调用完毕后,形参所占用的内存会自动被释放。

怎么做能在子函数里头引用调用函数去交换主程序当中两个变量的值呢,我于《C语言指针变量作为函数参数》这篇文章里做了详尽的讲解。

在实例里,函数声明以及这函数的定义乃是均处在主程序的上方位置;函数声明它也能够是处于主程序当中的,之后当主程序完结之后再去进行该函数的定义;又有或者是在主程序上方去声明该函数,随后在主程序结束之后再来进行定义。其中后面这两种方式的代码是如下这般:

#include int main () { int i_a = 100; int i_b = 200; void swap(int i_a, int i_b); //只声明不定义 printf("交换前i_a, i_b 的值: %d, %d\n", i_a, i_b); swap(i_a, i_b); /* 调用函数交换值*/ printf("交换后i_a, i_b 的值: %d,%d\n", i_a, i_b); return 0; } void swap(int i_a, int i_b) /*函数定义*/ { int temp; temp = i_a; /*保存地址 i_a 的值*/ i_a = i_b; /*把 i_b 赋值给 i_a*/ i_b = temp; /*把 temp 赋值给 i_b*/ return; //该函数无返回值 }

或者如下:

#include void swap(int i_a , int i_b); //只声明不定义 int main () { int i_a = 100; int i_b = 200; printf("交换前i_a, i_b 的值: %d, %d\n", i_a, i_b); swap(i_a, i_b); /*调用函数交换值*/ printf("交换后i_a, i_b 的值: %d, %d\n", i_a, i_b); return 0; } void swap(int i_a, int i_b) /*函数定义*/ { int temp; temp = i_a; /*保存地址 i_a 的值*/ i_a = i_b; /*把 i_b 赋值给 i_a*/ i_b = temp; /*把 temp 赋值给 i_b*/ return; //该函数无返回值 }

【实例 2】输入 3 个整数,并将最大值输出。

这个程序,先输入三个整数,分别是i_x、i_y和i_z,接着把i_x和i_y当作参数传递给函数GetMax(),去获取其中的最大值,之后将这个最大值赋给i_temp,把它作为函数返回值,然后返回给主程序的i_max变量,再一次调用函数GetMax(),又将i_z和i_max当作参数传递给函数GetMax(),把其中的最大值赋给i_temp当函数返回值,再返回给主程序的i_max变量,最后将i_max输出。

#include int GetMax(int i_x, int i_y) //获取二者中的最大值 { int i_temp; (a>b)?(i_ temp = i_x):(i_ temp = i_y); //三目运算,将最大值赋给i_temp return i_ temp; } int main(){ int i_x, i_y, i_z, i_max; printf("请输入三个数字(空格分隔):"); scanf("%d%d%d", &i_x, &i_y, &i_z); i_max=GetMax(i_x, i_y); //调用函数 i_max=GetMax(i_z, i_max); //再次调用函数 printf("最大数为: %d \n", i_max); return 0; }

编译运行,结果如下:

请输入三个数字(空格分隔): 1 22 11

最大数为: 22

http://www.jsqmd.com/news/637195/

相关文章:

  • 线性投影在机器学习中的5个实战应用:从PCA到特征提取
  • Agent落地为什么这么难?:从概念到生产的工程鸿沟
  • Go语言的go-ast抽象语法树包与代码生成工具的构建框架
  • 2026年4月13日 AI前沿资讯速览
  • 基于STM32的智能厨房安全检测系统(完整项目)
  • # 发散创新:SwiftUI 中状态管理的深度实践与重构艺术 在 SwiftUI 的世界里,**
  • DeepSC与语义通信:深度学习如何重塑文本传输的未来
  • 虚幻UE材质编辑器核心节点实战解析
  • HarmonyOS在语文教学中的应用-3. “青”字族变换(对应:③ 小青蛙)
  • 价值对齐窗口期仅剩11个月!SITS2026预警:未通过2026年Q2对齐基线测试的Agent将触发自动降权机制
  • 深度解析ImageNet分类任务中的卷积神经网络架构优化策略
  • 设计行李箱内部分隔片,收纳不乱,输出:长途出行刚需。
  • **发散创新:基于Rust的内存安全加固技术实战与深度剖析**在现代软件开发中,**内存安
  • Hermes Agent火了,AI智能体开始「会自我进化」
  • 《JAVA面经实录》- Java 科学学习顺序(看这篇就够了)
  • 关于MCU锁死使用仿真器的几种解决方法
  • Open Claw 一键安装教程|汉化版,全流程无代码、无需输任何命令
  • HarmonyOS在语文教学中的应用-4. 红井记忆卡片
  • AIAgent环境漂移灾难预警:基于GitOps+Policy-as-Code的12小时自动检测与修复闭环
  • STM32G474开发板(一)硬件架构深度解析与选型思考
  • 网络安全实战:熊猫烧香病毒行为分析与手工清除指南
  • 从零到一:双足机器人全身控制(WBC)核心算法与工程实践解析
  • 鸿蒙应用开发实战:从零配置DevEco Studio到真机运行的全流程避坑指南
  • 4G模块串口通讯实战:从AT指令到远程控制
  • 毕业设计救星:用STM32+OneNet平台快速搭建智能环境监测系统(含避坑指南)
  • **发散创新:基于Python构建高保真虚拟原型的实战指南**在软件工程与嵌入式开发中,**虚拟原型(Virtual Prototype
  • DS:具体详细介绍常见的DDR性能瓶颈和解决方案
  • SITS2026闭门报告首次公开(仅限本届参会者验证的6项硬指标+2套评估矩阵)
  • 新手也能懂:用Carsim和Simulink复现斯坦利(Stanley)轨迹跟踪算法(附避坑指南)
  • 从汇编指令到电压读数:51单片机驱动ADC0808的数码管电压表实战解析