C语言程序设计P5-2【应用函数进行程序设计 | 第二节】——知识要点:函数的参数及返回值和函数的调用及声明

news2025/1/10 21:54:16

知识要点:函数的参数及返回值和函数的调用及声明

视频:

目录

一、任务分析

二、必备知识与理论

三、任务实施


一、任务分析

1.求x的n次方的值也就是求n个x的乘积,可把x和n作为函数的形参,定义一个函数power来完成这个功能;

2.主调函数里提供实参,通过函数调用将实参的值传递给形参,调用完成后,power函数将所求的x的n次方的值作为返回值返回主调函数;

3.数据从主调函数里传递,可以增加程序的灵活性。

二、必备知识与理论

1.函数的参数

函数的参数用于建立函数之间的数据联系。当一个函数调用另一个函数时,实际参数的值会传递给形式参数,以实现主调函数与被调函数之间的数据通信。同时,函数参数的运用还可以提高函数的灵活性和通用性。

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

形式参数(简称形参)是指在定义函数时,跟在函数名后面的小括号中的变量名。实际参数(简称实参)是指调用函数时,跟在函数名后面的小括号中的表达式。

(2)参数的传递

在调用函数时,主调函数和被调函数之间有数据的传递——实参传递给形参。

关于形参与实参的说明:

(1)在定义函数中指定的形参变量,在未出现函数调用时,它们并不占内存中的存储单元。只有在发生函数调用时,函数中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。

(2)实参可以是常量、变量、表达式、函数等,无论实参是何种类型的变量,在进行调用时,它们都必须具有确定的值,以便在调用时将实参的值赋给形参,因此,实参在使用前必须事先赋值。

(3)实参和形参,名称可相同也可不同,但实参与形参的类型应一致,参数个数、对应顺序上也必须保持一致,否则,会发生“类型不匹配”的错误。在C语言中,字符型数据与0~255之间的整型数据可以互相通用。

(4)实参向形参传递数据,有两种方式:

①数值传递,也称传数值,如常量值、变量值、表达式值、数组元素值、函数值等,这些值都是由用户程序决定。

②地址传递,也称传地址,如变量地址、指针、数组名所代表的地址等,值由系统分配决定,用户不能指定。当然,地址也是数值,是一个地址数据值。

③数值传递和地址传递的区别:只是传递的数据类型不同。

(5)实参变量对形参变量的数值传递属于单向传递,只由实参传给形参,而不能由形参传回来给实参。

(6)函数调用,如果是数值传递,传递后实参仍保留原值并不改变。如果是地址传 递,传递后实参地址的值也不会改变,但地址的内容可能会改变。

2.函数的返回值

通常,希望通过函数调用使主调函数能得到一个确定的值,这就是函数的返回值。下面对函数值作一些说明:

(1) return语句:函数的返回值是通过函数中的return语句获得的。return语句的一般形式为:

return(表达式);

return语句将被调用函数中的一个确定值带回主调函数中,如果需要从被调用函数带回一个函数值(供主调函数使用),被调用函数中必须包含return语句。如果不需要从被调用函数带回函数值可以不要return语句。

①return语句后面的括弧也可以不要,如“return(z);”与“return z;”等价。

②return后面的值可以是一个表达式,例如:任务一中的max函数可以改写为:

max(int x,int y)

{ 

return(x>y?x:y);  

 }

这样的函数体更为简短,return语句的功能是计算表达式的值,并返回给主调函数。

③在函数中允许有多个return语句,但要求每个return后面的表达式的类型应相同。每次调用只能有一个return 语句被执行,因此只能返回一个函数值。

④如果被调函数中没有return语句,并不带回一个确定的、用户所希望得到的函数值,但实际上,函数并不是不带回值,而只是不带回有用的值,带回的是一个不确定的值。

(2)函数值的类型。既然函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型。例如:

int max(int x,int y)    /* 函数值为整型 */

double min(int x,int y)  /*函数值为双精度型*/

C语言规定,凡不加类型说明的函数,一律自动按整型处理。为了便于以后代码在不同编译环境下重复使用,建议在定义时对所有的函数都要指定函数类型。

(3)在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致。如果两者不一致,则以函数类型为准。对数值型数据,可以自动进行类型转换。即函数类型决定返回值的类型。

(4)对于“不带回值”的函数,应当使用“void”定义为“空类型”。这样,系统就保证在函数中不能使用return带回任何值。但系统仍然允许void类型函数使用return语句,此时语句的作用是结束函数的运行,返回到主调函数。

3.函数的调用

(1)函数调用的一般形式

函数定义一旦完成,我们就可以通过函数名来调用函数,执行函数体的内容,其过程与其它语言的子程序调用相类似。C语言中,函数调用的一般形式为:

函数名(实际参数表);

如果是调用无参函数,则实参表列可以没有,但括号不能省略。实参表列中的参数可以是常量、变量或其它构造类型数据及表达式。如果实参表列包含多个实参,则各实参之间用逗号分隔。实参与形参的个数应相等,类型应匹配。实参与形参按顺序一一对应传递数据。

(2)函数调用的方式

在C语言中,按照函数在程序中出现的位置,函数的调用方式有三种:

①函数表达式:

②函数语句:

③函数实参:

4.函数的声明

(1)对被调用函数的声明在主调函数中调用另一函数(即被调用函数)需要满足如下条件:

①首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。

②如果使用库函数,一般还应该在本文件开头用#include命令将调用有关库函数时所需用到的信息包含到本文件中来。例如,前面已经使用过的命令:

#include <stdio.h> 也可以写成 #include "stdio.h"

③如果使用用户自己定义的函数,而且该函数与主调函数在同一个文件中,一般还 应该在主调函数中对被调函数作声明,即向编译系统声明将要调用此函数,并将有关信息通知编译系统。

(2)函数声明的形式

从程序中可以看到对函数的声明与函数定义首部基本上是相同的,只差一个分号,因此可以简单地照写已定义的函数的首部,再加一个分号,就成为了对函数的“声明”。

函数声明的一般形式为:

函数类型 函数名(参数类型1,参数类型2,,参数类型n);

函数类型 函数名(参数类型1  形参1,参数类型2  形参2,,参数类型n  形参n);

其中,第一种形式是基本的形式。为了便于阅读程序,也允许在函数原型中加上参数名,就成了第二种形式。但编译系统不检查参数名,因此参数名是什么都无所谓,并不要求和函数的定义处保持一致。

(3)函数声明的位置:

三、任务实施

编写一函数,求x的n次方的值,其中n是整数。

算法分析:

(1)求x的n次方的值也就是求n个x的乘积,可把x和n作为函数的形参,定义一个函数power来完成这个功能。

(2)主调函数里提供实参,通过函数调用将实参的值传递给形参,调用完成后,power函数将所求的x的n次方的值作为返回值返回主调函数。

(3)power函数中用循环结构来实现该算法。

#include <stdio.h>

long power(int x,int n)   /* 函数定义 */

{ int i;

long p=1;

  for(i=1;i<=n;i++)

p*=x;

  return p;

}

main()   /* 主调函数 */

{ int x,n;

long y;

printf("Enter two numbers: x,n!\n");

scanf("%d,%d",&x,&n);   

  y=power(x,n);    /* 函数调用 */

  printf("Value=%ld\n",y);

}

运行结果如下:

Enter two numbers: x,n!

2,10↙

Value=1024

注意:本程序中power函数的定义在主调函数main之前,所以在程序中省略了对power函数的声明。

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

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

相关文章

40分钟学 Go 语言高并发:GRPC框架使用

gRPC框架使用 一、gRPC基础知识 知识点说明重要程度应用场景RPC原理远程过程调用的基本原理⭐⭐⭐⭐⭐分布式系统通信协议设计Protocol Buffers的使用⭐⭐⭐⭐⭐接口定义、数据序列化服务定义gRPC服务和方法定义⭐⭐⭐⭐服务接口设计性能优化连接池、压缩、流式处理⭐⭐⭐⭐高…

HTML Input 文件上传功能全解析:从基础到优化

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【ETCD】【源码阅读】ETCD启动流程源码解读

启动流程的图如下&#xff1a; 1、主函数入口 ETCD 启动的入口在 etcd/server/main.go 文件中。 package mainimport ("os""go.etcd.io/etcd/server/v3/etcdmain" )func main() {etcdmain.Main(os.Args) }这里调用了 etcdmain.Main()&#xff0c;这是 …

【RBF SBN READ】hadoop社区基于RBF的SBN READ请求流转

读写分离功能的背景及架构 当前联邦生产集群的各个子集群只有Active NameNode在工作,当读写任务变得繁忙的时候,只有一个Active负责处理的话,此时集群的响应和处理能力业务侧感知会明显下降,为此,我们将引入Observer架构,实现读写功能的分离,使得Active只负责写请求,而…

计算机运行时提示错误弹窗“由于找不到 quazip.dll,无法继续执行代码。”是什么原因?“quazip.dll文件缺失”要怎么解决?

计算机运行时错误解析&#xff1a;解决“quazip.dll缺失”问题指南 在软件开发和日常计算机使用中&#xff0c;我们经常会遇到各种运行时错误。今天&#xff0c;我们将深入探讨一个常见的错误提示&#xff1a;“由于找不到quazip.dll&#xff0c;无法继续执行代码。”这一弹窗…

NuHertz/HFSS: 使用矩形、径向和阻抗短截线的平面 LPF 切比雪夫-II 实现

我们今天的主题是使用 NuHertz 和 HFSS 设计 Microstrip Lowpass Chebyshev-Type2 滤波器。切比雪夫 2 型在通带中具有平坦的响应&#xff0c;在阻带中具有波纹。我们将比较 NuHertz 中的不同选项。 低通滤波器由集总 L 和 C 组件制成。这种方法很难用于高频应用程序。高频滤波…

SpringBoot整合knife4j,以及会遇到的一些bug

这篇文章主要讲解了“Spring Boot集成接口管理工具Knife4j怎么用”&#xff0c;文中的讲解内容简单清晰&#xff0c;易于学习与理解&#xff0c;下面请大家跟着小编的思路慢慢深入&#xff0c;一起来研究和学习“Spring Boot集成接口管理工具Knife4j怎么用”吧&#xff01; 一…

高效的 Java 对象映射库“Orika”

什么是 Orika Orika 是一个高效的 Java 对象映射库&#xff0c;专门用于简化 Java 应用程序中对象之间的转换。它以自动化和优化的方式将一个对象的属性映射到另一个对象&#xff0c;从而减少了手动编写重复代码的需要。Orika 特别适合处理复杂的对象结构以及数据传输对象 &am…

汽车总线协议分析-CAN-FD总线

随着汽车功能的增多&#xff0c;各ECU之间的信息交互也越来越频繁&#xff0c;导致总线负载持续走高&#xff0c;CAN2.0报文只有约40%-50%带宽实际用于数据传输&#xff0c;响应机制易受车内布线的物理特性限制&#xff0c;如广播延迟、导线延迟等&#xff0c;CAN的局限性也逐渐…

【JavaEE】多线程(6)

一、用户态与内核态 【概念】 用户态是指用户程序运行时的状态&#xff0c;在这种状态下&#xff0c;CPU只能执行用户态下的指令&#xff0c;并且只能访问受限的内存空间 内核态是操作系统内核运行时的状态&#xff0c;内核是计算机系统的核心部分&#xff0c;CPU可以执行所有…

故障处理--kuboard无法访问,etcd磁盘空间不足

问题现象&#xff1a; kuboard页面报错 排查过程&#xff1a; 1、查看kuboard是否正常。 2、查看kuboard容器的日志&#xff1a; docker logs -f --tail10 kuboard 大概内容如下&#xff1a; levelerror msg"failed to rotate keys: etcdserver: mvcc: database sp…

unity3d—demo(实现给出图集名字和图片名字生成对应的图片)

目录 实现给出图集名字和图片名字生成对应的图片&#xff1a; 代码示例&#xff1a; dic: 键 是图集名称 值是一个字典 该字典键是图片名称 值是图片&#xff0c;结构如图&#xff1a; 测试代码&#xff1a; 结果&#xff1a; SpriteRenderer 讲解&#xff1a; Resour…

工业异常检测-CVPR2024-新的3D异常数据合成办法和自监督网络IMRNet

论文&#xff1a;https://arxiv.org/pdf/2311.14897v3.pdf 项目&#xff1a;https://github.com/chopper-233/anomaly-shapenet 这篇论文主要关注的是3D异常检测和定位&#xff0c;这是一个在工业质量检查中至关重要的任务。作者们提出了一种新的方法来合成3D异常数据&#x…

WPF编写工业相机镜头选型程序

该程序满足面阵和线阵的要求。 前端代码 <Window x:Class"相机镜头选型.MainWindow" Loaded"Window_Loaded"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml…

springai结合ollama

目录 ollama 介绍 使用 下载&#xff1a; 安装&#xff1a; 点击这个玩意next就行了。 运行 spring ai使用ollama调用本地部署的大模型 加依赖 配置yml 写代码 ollama 介绍 官网&#xff1a;Ollama Ollama是一个用于部署和运行各种开源大模型的工具&#xff1b; …

Linux 统信UOS 设置程序“桌面快捷方式”与“开机自启动”

最近在统信uos系统 arm64架构上进行QT程序的开发&#xff0c;基本开发完毕后&#xff0c;开始着手准备程序的开机自启动模块&#xff0c;因为一般来说&#xff0c;程序在客户现场使用都是需要开机自启的。 然后在百度海淘&#xff0c;很少有这类相关的博客介绍&#xff0c;有一…

WiFi受限不再愁,电脑无网络快速修复指南

有时在试图连接WiFi时&#xff0c;会发现网络连接受限&#xff0c;或无法正常访问互联网。这种情况不仅影响了工作效率&#xff0c;还可能错过重要的信息。那么&#xff0c;究竟是什么原因导致了电脑WiFi连接受限呢&#xff1f;又该如何解决这一问题呢&#xff1f;小A今天就来教…

java注解(一):什么是注解?什么是元注解?如何自定义注解?注解的原理是什么?

目录 1、什么是注解&#xff1f; 2、什么是元注解 1、Target() 2、Retention() 3、Documented 4、Inherited 3、如何自定义注解以解使用 4、注解的原理 本篇文章主要是介绍注解的概念、原理&#xff0c;以及通过代码演示4种元注解、如何自定义注解。通过反编译的形式进…

【Docker】Linux与Windows系统安装Docker+Docker上简单安装MySQL

一、Windows安装Docker 由于我在许多平台搜索Windows下安装Docker的方法&#xff0c;都提到了Win10家庭版无法直接安装Docker。个人电脑就是Win10家庭版&#xff0c;本着实践出真知的想法&#xff0c;个人在本机Win10家庭版实验结果为需要采用下述传统手动安装的办法&#xff…

阿里云整理(二)

阿里云整理 1. 访问网站2. 专业名词2.1 域名2.2 域名备案2.3 云解析DNS2.4 CDN2.5 WAF 1. 访问网站 用户使用浏览器访问网站大体分为几个过程&#xff1a; 用户在浏览器输入域名URL&#xff0c;例如www.baidu.com。 不过&#xff0c;浏览器并不知道为该域名提供服务的服务器具…