当前位置: 首页 > 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 个整数,并将最大值输出。

这个程序先输入 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/638125/

相关文章:

  • 如何在创建Git分支时指定与某个远程分支的跟踪关系
  • FreeRTOS时间管理实战:如何用vTaskDelay和vTaskDelayUntil实现精准任务调度
  • 不用Hibernate,自己搓ActiveRecord:状态机追踪字段变更,一个save搞定增删改
  • Fish Speech 1.5开发者案例:集成至微信小程序实现语音播报功能
  • MT5文本增强镜像实操手册:3步完成Streamlit本地部署+中文句子裂变
  • 一些硬件相关的题目
  • Retinaface+CurricularFace镜像作品集:高清人脸比对效果展示
  • JCMsuite应用:孤立线栅
  • Z-Image-Turbo-rinaiqiao-huiyewunv技术深挖:text_encoder/vae权重忽略策略对生成稳定性影响
  • 【说明书】XD-LY8话务员蓝牙耳机
  • YOLOv5-Lite架构设计:ShuffleNetV2、PPLcNet、RepVGG三大骨干网络详解
  • Kaggle 竞赛解决方案终极指南:快速掌握数据科学实战技巧
  • Blender 3MF插件:从建模到3D打印的终极桥梁
  • 在只有CPU的云服务器上,我是如何一步步让vLLM成功识别并运行Qwen2-7B的
  • 【算法题攻略】滑动窗口
  • 千问3.5-9B辅助MySQL数据库设计与优化实战
  • SpringCloud进阶--Seata与分布式事务垂
  • Z-Image-Turbo-rinaiqiao-huiyewunv 多 GPU 并行计算配置与负载均衡
  • 如何从零开始训练BAGEL多模态模型:完整实战指南
  • 【C++程序设计第7课--继承】
  • 忙得上天入地的导师派师姐助我毕设之救我狗命笔记(一)
  • 千问3.5-2B Java面试题智能辅导:刷题与知识点解析
  • 手把手教你用BERT+HanLP搞定中文社交媒体仇恨言论识别(附完整代码与数据集)
  • 忍者像素绘卷在社区运营中的应用:粉丝定制像素头像活动案例
  • Chrome文本替换插件终极指南:如何智能编辑任何网页内容
  • 忍者像素绘卷:天界画坊在软件测试中的应用:自动化生成测试用例图示
  • 智慧城市顶层设计与底层对接(上篇):战略规划与总体架构实操
  • 【基于文本的运动生成text-to-motion】Hi-Motion: Hierarchical Intention Guided Conditional Motion Synthesis
  • 基于FunASR的智能语音助手搭建:WebUI界面操作,支持实时对话
  • AI Agent vs 区块链:哪个才是真正的风口