c语言 - 函数的基本用法及传参

函数

  • 函数是一个完成特定功能的代码模块,其程
    序代码独立,通常要求有返回值,也可以是
    空值。
  • 一般形式如下:
    <数据类型><函数名称>( <形数说明> )
    {语句序列;return[(<表达式>)];}
  • 函数的声明就是指函数原型
  • 其中,<形式参数声明>可以缺省声明的变量名称,但类型不能缺省
  • 例如,
    double Power(double x, int n);
    double Power(double,int); //缺省写法,但这种写法只能在单独一句话函数声明时使用,不能在函数实现时缺省
  • 函数的类型不为 void 的时候有返回值,这时要写 return 语句,反之无
  • 函数要先声明再调用,不能放在 main 函数 后面声明,如果不想把大段的函数全部放在main函数的上方,那么用简短的语句在main函数上方进行声明,然后在main函数后面再实现也可以,例如:
#include<stdio.h>double power(double x, int n);//先进行声明,在后面实现也可以int main()
{printf("2的2次方为:%lf\n",power(3,3));return 0;
}double power(double x, int n)//函数具体的实现
{double product = 1;int i;for (i=0; i<n; i++){product *= x;}return product;
}

以上代码格式为 函数先声明,再调用,然后实现 的顺序

函数的参数传递

函数之间的参数传递方式:

  • 全局变量
  • 复制传递方式
  • 地址传递方式

全局变量

  • 全局变量就是在函数体外说明的变量,它们在程序中的每个函数里都是可见的
  • 全局变量一经定义后就会在程序的任何地方可见。函数调用的位置不同,程序的执行结果可能会受到影响。不好维护,不建议使用。
  • 例子:
#include<stdio.h>int x = 3, n = 2;//定义全局变量x,n
double power();int main()
{printf("%d的%d次方为:%lf\n",x,n,power());//这里无需再传参了return 0;
}double power()//这里不要参数也行了
{double product = 1;int i;for (i=0; i<n; i++){ //这里x和n直接使用全局变量product *= x;}return product;
}

复制(赋值)传递方式

  • 调用函数将实参传递给被调用函数,被调用函数将创建同类型的形参并用实参初始化
  • 形参是新开辟的存储空间,因此,在函数中改变形参的值,不会影响到实参,见代码2
  • 复制传参例子(代码1):
#include<stdio.h>double power(double x, int n);int main()
{int x = 2;int n = 2;printf("2的2次方为:%lf\n",power(x,n)); //把x,n作为实参赋值给形参x,nreturn 0;
}double power(double x, int n)//形参x,n
{double product = 1;int i;for (i=0; i<n; i++){product *= x;}return product;
}

输出结果:

2的2次方为:4.000000

代码2:

#include<stdio.h>void exchange(int a, int b);int main()
{int c = 2;int d = 3;exchange(c,d);printf("c = %d, d = %d\n",c,d);//在main函数中打印return 0;
}void exchange(int a, int b)
{int t;t = a;a = b;b = t;
}

输出结果:

c = 2, d = 3

从上面这个结果可以看出实参 c 和 d 并没有发生交换,但是这具体是什么原因呢?

答案是:形参和实参在内存中的存储空间是不一样的,形参是另外开辟的存储空间,当 exchange 函数被调用时,c 的值被复制(赋值,下同)到形参 a 中,同样的,d 的值被复制到形参 b 中,也就是形参 a 和 b 中存的都是实参 c 和 d 的副本,而在 exchange 函数内部只会交换形参 a 和 b 的值,不会影响到实参 c 和 d。

如果想要实质性的交换需用指针,(PS:交换指针的值-地址没有用,除非直接在被调用函数中打印交换地址过后的 *a 和 *b )如果只是想看一下打印结果,可以把输出函数写到被调用函数(交换函数)中去,这里举一个用指针进行实质交换的例子:

#include<stdio.h>void exchange(int * a, int * b);//形参都为指针int main()
{int c = 2;int d = 3;exchange(&c,&d); //实参为 c 和 d 的地址printf("c = %d, d = %d\n",c, d); //在这里打印return 0;
}void exchange(int * a, int * b)
{int t;t = *a;*a = *b;*b = t; // * 取传入地址对应的值,然后通过 t 进行交换}

输出结果:

c = 3, d = 2

地址传递方式

  • 按地址传递,实参为变量的地址,而形参为同类型的指针
  • 被调用函数中对形参的操作,将直接改变实参的值(被调用函数对指针的目标操作,相当于对实参本身的操作)
  • 例子就是上个代码

复制传递和地址传递的适用场景

在C语言中,参数传递可以通过值传递(复制传递)或引用传递(地址传递)来实现。选择何种方式取决于对函数的需求和要求。

  1. 复制传递(值传递):
    使用复制传递时,函数接收到的是实际参数的副本,而不是实际参数本身。这意味着在函数内部对形式参数进行的修改不会影响到实际参数的值。

    复制传递适用于以下情况:

    • 当函数不需要修改实际参数的值时。
    • 当实际参数是基本数据类型(如整数、浮点数等)或小型结构体时,复制传递的开销相对较小。

    示例代码中的exchange函数使用了复制传递,因为我们只是想在函数内部交换参数的值,并不需要修改实际参数的值。

  2. 地址传递(引用传递):
    使用地址传递时,函数接收到的是实际参数的地址,可以通过指针操作实际参数的值。在函数内部对形式参数的修改会影响到实际参数的值。

    地址传递适用于以下情况:

    • 当需要修改实际参数的值时。
    • 当实际参数是大型结构体或数组时,避免复制大量的数据。

    示例代码中的修改后的exchange函数使用了地址传递,我们通过传递指针来操作实际参数的地址,从而实现变量值的交换。

总而言之,在选择参数传递方式时,需要根据具体的需求和情况来决定。如果需要修改实际参数的值,或者实际参数是大型结构体或数组时,地址传递通常是更好的选择。而对于不需要修改实际参数的值,或者实际参数是基本数据类型或小型结构体时,复制传递是更简单和高效的方式。

函数的传参 - 数组

  • 全局数组传递方式
  • 复制传递方式(实参为数组的指针,形参为数组名(本质是一个指针变量))
  • 地址传递方式(实参为数组的指针,形参为同类型的指针变量)
  • 对于字符数组来说,传参的时候只穿数组名也行,因为程序可以根据 ‘\0’ 字符串结束符来判断结束,而 int 类型等类型的数组还必须要传进去数组元素个数,否则程序不知道数组的末尾在哪。

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

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

相关文章

【Vue框架】 router和route是什么关系

前言 之前没太注意&#xff0c;写着写着突然发现它们貌似不太一样&#xff0c;记录以下&#xff0c;回顾的看总结就好。 1、总结✨ route&#xff1a;当前激活路由的对象&#xff0c;用于访问和操作当前路由的信息 router&#xff1a;管理多个route的对象&#xff0c;整个应…

windows下安装go环境 和vscode中go扩展

1. 首先安装GO Go下载地址&#xff1a;go.dev 选择相对应的版本&#xff0c;下载&#xff0c;运行安装程序&#xff0c;并打开命令提示符&#xff0c;运行 go env &#xff0c;确认已经安装go 注意关注其中GOPATH和GOROOT&#xff0c;这两个地址可以在系统环境变量中进行设置…

2023-08-24力扣每日一题

链接&#xff1a; 1267. 统计参与通信的服务器 题意&#xff1a; 同行同列可以发生通信&#xff0c;求能发生通信的机器数量 解&#xff1a; 标记每行/每列的机器个数即可 实际代码&#xff1a; #include<bits/stdc.h> using namespace std; class Solution { pub…

纸贵科技连续三年蝉联IDC中国 FinTech 50榜单

近日&#xff0c;国际权威市场研究机构IDC公布了“2023 IDC中国FinTech 50榜单”。作为领先的区块链技术和解决方案服务商&#xff0c;纸贵科技凭借过硬的区块链技术和丰富的金融科技创新成果&#xff0c;连续第三年荣登IDC中国FinTech 50榜单。 IDC中国FinTech 50榜单是金融科…

【Apollo】自动驾驶感知——毫米波雷达

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

在Mybatis中写动态sql这些标签:if、where、set、trim、foreach、choose的作用是什么,怎么用?

在 MyBatis 中&#xff0c;您可以使用动态 SQL 标签来构建灵活的 SQL 查询&#xff0c;以根据不同的条件生成不同的查询语句。以下是这些标签的作用和用法&#xff1a; 1. **<if> 标签&#xff1a;** 用于根据某个条件动态地包含或排除 SQL 片段&#xff0c;test:可以写…

单词搜索:在二维网格中寻找单词的存在

题目连接 链表主页 在本篇文章中&#xff0c;我们将深入探讨 LeetCode 题目 "203. 移除链表元素" 的解题方法&#xff0c;从问题的分析、解题思路、代码实现到核心知识点的罗列&#xff0c;带你逐步理解如何使用C来删除链表中所有满足指定值的节点&#xff0c;并返…

Python科研数据可视化

在过去的20 年中&#xff0c;随着社会产生数据的大量增加&#xff0c;对数据的理解、解释与决策的需求也随之增加。而固定不变是人类本身&#xff0c;所以我们的大脑必须学会理解这些日益增加的数据信息。所谓“一图胜千言”&#xff0c;对于数量、规模与复杂性不断增加的数据&…

Java小游戏

一、需求 二、思路一 HP当然是怪物的一个属性成员&#xff0c;而武器是角色的一个属性成员&#xff0c;类型可以使字符串&#xff0c;用于描述目前角色所装备的武器。角色类有一个攻击方法&#xff0c;以被攻击怪物为参数&#xff0c;当实施一次攻击时&#xff0c;攻击方法被调…

阿里云配置MySQL-server 8.0远程登录

Ubuntu 22.04 LTS 安装MySQL-Server 8.0 # apt search mysql-server # apt install mysql-server重建服务 # service mysql stop # vi /etc/mysql/mysql.conf.d/mysqld.cnf ... bind-address 0.0.0.0 ... # service mysql start # lsof -i:3306 COMMAND PID USER FD …

PHP之ZipArchive打包压缩文件

1、Linux 安装 nginx 安装zlib库 2、使用&#xff0c;目前我这边的需求是。 1、材料图片、单据图片&#xff0c;分别压缩打包到“材料.zip”和“单据.zip”。 2、“材料.zip”和“单据.zip”在压缩打包到“订单.zip” 3、支持批量导出多个订单的图片信息所有订单的压缩文件&…

创建k8s operator

目录 1.前提条件 2.进一步准备 2.1.安装golang 2.2.安装code&#xff08;vscode的linux版本&#xff09; 2.3.安装kubebuilder 3.开始创建Operator 3.1.什么是operator? 3.2.GV & GVK & GVR 3.3.创建operator 3.3.1. 生成工程框架 3.3.2.生成api(GVK) …

0101prox-shardingsphere-中间件

1 启动ShardingSphere-Proxy 1.1 获取 目前 ShardingSphere-Proxy 提供了 3 种获取方式&#xff1a; 二进制发布包DockerHelm 这里我们使用Docker安装。 1.2 使用Docker安装 step1&#xff1a;启动Docker容器 docker run -d \ -v /Users/gaogzhen/data/docker/shardings…

windows安装新openssl后依然显示旧版本

1、Windows环境下升级openssl后&#xff0c;通过指令openssl version -a查看版本号&#xff1a; 这个版本号是以前的老版本&#xff0c;不知道在哪里 2、网上找了老半天也没找到答案&#xff0c;最后通过指令 where openssl 才找到原来的openssl在哪里&#xff0c;把老的卸载掉…

【C# Programming】编程入门:数组、操作符、控制流

目录 一、数组 1、数组的声明 1.1 一维数组声明&#xff1a; 1.2 多维数组声明&#xff1a; 2、数组的实例化和赋值 2.1 数组在声明时通过在花括号中使用以逗号分隔的数据项对数组赋值&#xff0c; 例如&#xff1a; 2.2 如果在声明后赋值&#xff0c;则需…

数据采集:selenium 获取 CDN 厂家各省市节点 IP

写在前面 工作需要遇到&#xff0c;简单整理理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#xff0c;是人的逃避方式&#xff0c;是对…

如何使用CSS实现一个无限循环滚动的图片轮播效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐HTML 结构⭐ CSS 样式⭐ JavaScript 控制⭐ 注意事项&#xff1a;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff0…

数据集收集列表(opencv,机器学习,深度学习)持续更新

opencv 车牌识别数据集 opencv 手写数字识别数据集 机器学习 Pima Indians数据集&#xff0c;下载地址

Kyligence Copilot 登陆海外,斩获 Product Hunt 日榜 TOP 2

8月14日&#xff0c;AI 数智助理 Kyligence Copilot 在全球知名科技产品平台 Product Hunt 上线&#xff0c;其以出色的产品创新实力&#xff0c;在激烈的竞争中脱颖而出&#xff0c;仅仅在 24 小时内收获了超过 400 个投票和近 200 条支持评论&#xff0c;荣登当日产品榜排名第…

C++动态规划经典案例解析之合并石子

1. 前言 区间类型问题&#xff0c;指求一个数列中某一段区间的值&#xff0c;包括求和、最值等简单或复杂问题。此类问题也适用于动态规划思想。 如前缀和就是极简单的区间问题。如有如下数组&#xff1a; int nums[]{3,1,7,9,12,78,32,5,10,11,21,32,45,22}现给定区间信息[…