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

C语言(19)----------->函数(2)

本文介绍了C语言的return语句及其它在C语言函数中的作用,以及介绍了二维数组和一维数组传参时的一些注意事项和使用数组传参时的方法。

若没有学习过C语言的一维数组和二维数组,建议参考如下文章:

C语言(15)-------------->一维数组-CSDN博客

C语言(16)---------->二维数组-CSDN博客

一、return语句

1.return语句后面可以是一个数值,也可以是一个表达式,若是一个表示式则计算表达式后,返回表达式的值。

参考:(return语句后面是一个数值)

#include <stdio.h>int test(int x,int y)
{int z = 0;z = x + y;return z;
}int main()
{int add = 0;add = test(4,5);printf("add=%d\n", add);return 0;
}

运行结果:

参考:(return语句后面是一个表达式)

#include <stdio.h>int test(int x,int y)
{return x + y;
}int main()
{int add = 0;add = test(4,5);printf("add=%d\n", add);return 0;
}

运行结果:

2.可以直接使用一个return,适合的函数返回类型是void型。

同时,return语句执行时,函数将彻底返回,后边的代码不再执行。

实验代码:

#include <stdio.h>//打印1到n的数字
void Print(int n)
{if (n < 1)return;//若传入的数字小于1,函数提前返回,提前结束//不使用break的原因是因为break通常用于循环中int i = 0;for (i = 1; i <= n; i++){printf("%d ",i);}
}int main()
{int re = 0;Print(-2);//打印1到100的数字return 0;
}

此用法使用时函数提前返回,提前结束。

(1)启动调试

(2)逐语句调试,直至进入函数前

(3)到达Print函数时逐语句调试进入函数体内部 

(4)Print函数体内部逐语句调试

 函数体内if的判断

 n=-2,n是小于1的,执行return语句,跳出函数体。

 跳出函数体回到主函数中

 主函数中逐语句调试,直至退出。

 3.return返回的值和函数的返回类型不一样时,系统将隐式转换为函数的返回类型。

实验代码:

#include <stdio.h>int test()
{return 3.5;
}int main()
{int re = 0;re=test();printf("re=%d\n",re);return 0;
}

4. return语句执行时,函数将彻底返回,后边的代码不再执行。

实验代码:

#include <stdio.h>int test()
{return 3.5;printf("hehe\n");
}int main()
{int re = 0;re = test();printf("re=%d\n", re);return 0;
}

运行结果:

 从运行结果中,可以看到test函数执行return语句后,不再执行return语句后面的printf函数。

分析:

(1)启动调试

(2)逐语句调试

 

5.若函数中存在if等分支语句,要保证每种情况下都有return返回,否则会有编译错误。 

实验代码:

#include <stdio.h>int test(int n)
{if (n % 2 == 1)return 1;
}int main()
{int re = 0;re = test(4);printf("re=%d\n", re);return 0;
}

运行结果:

出现警告的原因是忽略了为偶数的情况,当输入偶数时没有返回值。

修改:

代码:

#include <stdio.h>int test(int n)
{if (n % 2 == 1)return 1;elsereturn 0;
}int main()
{int re = 0;re = test(4);printf("re=%d\n", re);return 0;
}

运行结果:

二、数组作为函数的参数

例如,在一个数组中存放了1到10的数字,现在需要使用函数实现将这10个数字都变成0。怎么编写这个函数呢?

首先,函数要遍历1到10的数字。

其次,把这10个数字都赋值成0。

#include <stdio.h>//函数的功能:将数组中的内容都变成0
void Set_Arr(int arr2[], int sz2)
{int i = 0;for (i = 0; i < sz2; i++){arr2[i] = 0;}
}int main()
{int arr1[] = {1,2,3,4,5,6,7,8,9,10};int sz1 = sizeof(arr1) / sizeof(arr1[0]);Set_Arr(arr1,sz1);return 0;
}

注意事项: 

 1.函数的形参名和实参名可以一样。此处为了方便在调试窗口中观察使用了不同的名字。

2.数组传参写的是数组名,对于数组知识不扎实的可以参考我之前写的博客:

C语言(15)-------------->一维数组-CSDN博客

3.对于一维数组,形参写的是数组的形式,并且在形参书写的时候可以省略数组的个数。

4.对于二维数组,形参写的是数组的形式,并且在形参书写的时候可以省略数组的行数,但是不可以省略数组的列数。

对于二维数组不了解的可以参考我的博客:

C语言(16)---------->二维数组-CSDN博客

5.数组传参后,形参的数组和实参的数组是同一块空间,改变形参的数组就是改变实参的数组(请看下面的调试过程)

(1)启动调试

(2)逐语句分析进入函数的内部:

 (3)打开监视窗口,监视arr1和arr2

我们可以看到arr1和arr2的地址是一样的,说明共用了同一块内存,如果修改了arr2中的内容那么arr1中的内容也会被修改。 

(4)修改成功

  

如果学会了数组的传参,那么现在我们再为刚刚那个例子写一个函数,实现数组内容的打印。

参考代码:

#include <stdio.h>//函数的功能:将数组中的内容都变成0
void Set_Arr(int arr2[], int sz2)
{int i = 0;for (i = 0; i < sz2; i++){arr2[i] = 0;}
}//函数的功能:打印数组中的内容
void Print_Arr(int arr3[], int sz3)
{int i = 0;for (i = 0; i < sz3; i++){printf("%d ",arr3[i]);}printf("\n");//换行,若此函数复用时也可以区分数字
}
int main()
{int arr1[] = {1,2,3,4,5,6,7,8,9,10};int sz1 = sizeof(arr1) / sizeof(arr1[0]);Print_Arr(arr1, sz1);//数组内容改变前Set_Arr(arr1,sz1);Print_Arr(arr1, sz1);//数组内容改变return 0;
}

运行结果:

 

将一个二维数组中的数字全部替换为1。

 参考代码:

#include <stdio.h>
#define Column 6//将二维数组中的内容全部替换为1
void Set_Two_Arr(int arr2[][Column], int ROW1,int Column1)
{int i = 0;for (i = 0; i < ROW1; i++){int j = 0;for (j = 0; j < Column1; j++){arr2[i][j] = 1;}}
}//打印二维数组
void Print_Two_Arr(int arr3[][Column], int ROW2, int Column2)
{int i = 0;for (i = 0; i < ROW2; i++){int j = 0;for (j = 0; j < Column2; j++){printf("%d ", arr3[i][j]);}printf("\n");//避免所有的数字都在一行}printf("\n");//换行,若此函数复用时也可以区分数字
}
int main()
{int arr1[][Column] = { {1,2,3,4,5,6},{2,3,4,5,6,7},{3,4,5,6,7,8} };int sz = 0;sz = sizeof(arr1) / sizeof(arr1[0][0]);//计算二维数组中的个数int ROW = sz / Column;Print_Two_Arr(arr1, ROW, Column);//数组内容改变前Set_Two_Arr(arr1,ROW,Column);Print_Two_Arr(arr1, ROW, Column);//数组内容改变return 0;
}

运行结果:

  二维数组传参时形参和实参所用地址一样的:

  对于数组的传参,做如下的总结:

  1. 函数的形参与实参的个数要匹配。
  2. 函数的实参是数组,形参的形式也可以写成数组。
  3. 形参若是一维数组,则数组的大小可以忽略不写。
  4.  形参若是二维数组,则数组的行可以忽略不写,但是列数一定要写
  5. 数组传参不会创建新数组,这是因为数组传参的形参和实参的地址是同一块的。
  6. 形参操作的数组和实参的数组是同一个数组。

 

相关文章:

C语言(19)----------->函数(2)

本文介绍了C语言的return语句及其它在C语言函数中的作用&#xff0c;以及介绍了二维数组和一维数组传参时的一些注意事项和使用数组传参时的方法。 若没有学习过C语言的一维数组和二维数组&#xff0c;建议参考如下文章&#xff1a; C语言&#xff08;15&#xff09;--------…...

动态扩缩容引发的JVM堆内存震荡:从原理到实践的GC调优指南

目录 一、典型案例&#xff1a;系统发布后的GC雪崩事件 &#xff08;一&#xff09;故障现象 1. 刚刚启动时 GC 次数较多 2. 堆内存锯齿状波动 3. GC日志特征&#xff1a;Allocation Failure &#xff08;二&#xff09;问题定位 二、原理深度解析&#xff1a;JVM内存弹…...

为何在用户注销时使用 location.href 而非 Vue Router 的 router.push

在开发 Web 应用时&#xff0c;用户注销功能的设计看似简单&#xff0c;但背后隐藏着对状态管理、安全性和用户体验的深层考量。以下将详细探讨为何许多项目在注销跳转时选择 location.href&#xff08;强制刷新页面&#xff09;而非 Vue Router 的 router.push&#xff08;单页…...

开源工具推荐:Uptime Kuma监控

1. 概述 Github&#xff1a;louislam/uptime-kuma: A fancy self-hosted monitoring tool Uptime Kuma is an easy-to-use self-hosted monitoring tool. Uptime Kuma 是一款开源的监控工具&#xff0c;可以帮助你实时监测网站或服务的状态&#xff0c;并在发生故障时及时通…...

《基于Selenium的论坛系统自动化测试实战报告》

一、项目背景与技术选型 项目简介 目标系统&#xff1a;论坛系统 核心功能&#xff1a;用户注册/登录、会话框发送信息、好友列表、信息发送 技术栈&#xff1a;html Springboot MySQL数据库 为什么选择Selenium 支持多浏览器兼容性测试&#xff08;Chrome/Firefox/Edge&…...

深入解析SQL Server高级SQL技巧

SQL Server 是一种功能强大的关系型数据库管理系统&#xff0c;广泛应用于各种数据驱动的应用程序中。在开发过程中&#xff0c;掌握一些高级SQL技巧&#xff0c;不仅能提高查询性能&#xff0c;还能优化开发效率。这篇文章将全面深入地探讨SQL Server中的一些高级技巧&#xf…...

分布式中间件:环境准备

在当今数字化的时代&#xff0c;分布式系统已经成为了开发领域的主流。分布式中间件在其中扮演着至关重要的角色&#xff0c;它能够帮助我们更好地处理高并发、高可用等复杂的业务场景。在这个系列的博客中&#xff0c;我将带大家深入学习分布式中间件的相关知识&#xff0c;主…...

c# winform程序 vs2022 打包生成安装包

最近&#xff0c;利用c# winform程序该客户开发一套进销存管理系统&#xff0c;项目在部署前&#xff0c;需要生成安装包&#xff0c;以便部署在客户电脑上面。总结步骤如下&#xff1a; 1、在打包之前 (VS中需要包括Microsoft visual studio installer projects扩展项目)&…...

探索Elasticsearch:文档的CRUD

在企业环境中&#xff0c;Elasticsearch对文档操作的支持不仅是实现高效搜索的关键&#xff0c;更是数据驱动决策的重要支柱。它通过强大的索引机制和灵活的查询语言&#xff0c;使企业能够实时处理和分析海量文档数据&#xff0c;迅速获取有价值的洞察&#xff0c;从而加速创新…...

面试基础--Spring Boot启动流程及源码实现

深度解析Spring Boot启动流程及源码实现 一、Spring Boot启动全景图&#xff08;含核心阶段&#xff09; #mermaid-svg-dYTQ6WPa3o6vKFHh {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dYTQ6WPa3o6vKFHh .error-i…...

火语言RPA--PDF提取图片

【组件功能】&#xff1a;提取PDF文档指定位置图片 配置预览 配置说明 文件路径 支持T或# 默认FLOW输入项 待提取图片的PDF文件的完整路径。 提取位置 全部、指定页、指定范围3种位置供选择。 PDF文件密码 支持T或# 打开PDF文件的密码。 页码 支持T或# 提取指定页的页…...

力扣977.有序数组的平方(双指针)

给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 方法一&#xff1a;直接将每个元素的平方压入ans数组中&#xff0c;再对ans数组进行排序 class Solution { public:vector<int> sort…...

QT——文件IO

QFile 类 构造函数 QFile() 无参构造 仅仅构建一个QFile 对象&#xff0c;不设定文件名 QFile(文件名) 构建一个QFile对象的同时&#xff0c;设定文件名 但是注意&#xff0c;仅仅设定文件名&#xff0c;并不会打开该文件 设定文件名 QFile file file.setFileName…...

分布式中间件:Redis介绍

目录 Redis 概述 Redis 的特点 高性能 丰富的数据结构 持久化 分布式特性 简单易用 Redis 的数据结构 字符串&#xff08;String&#xff09; 哈希&#xff08;Hash&#xff09; 列表&#xff08;List&#xff09; 集合&#xff08;Set&#xff09; 有序集合&…...

服务器和本地电脑之间如何传输文件

在服务器和本地电脑之间传输文件可以通过多种方式实现&#xff0c;常见的方法包括使用 SFTP&#xff08;安全文件传输协议&#xff09;、SCP&#xff08;安全复制协议&#xff09;、FTP&#xff08;文件传输协议&#xff09;、rsync、以及 云存储 等工具。以下是几种常见的方法…...

经验分享:用一张表解决并发冲突!数据库事务锁的核心实现逻辑

背景 对于一些内部使用的管理系统来说&#xff0c;可能没有引入Redis&#xff0c;又想基于现有的基础设施处理并发问题&#xff0c;而数据库是每个应用都避不开的基础设施之一&#xff0c;因此分享个我曾经维护过的一个系统中&#xff0c;使用数据库表来实现事务锁的方式。 之…...

嵌入式学习前要了解的基础知识

一、电压和电流 在嵌入式开发中&#xff0c;电压和电流是两个基本的电气概念&#xff0c;对于理解和设计电子电路至关重要。它们直接影响到嵌入式系统的性能、功耗、可靠性和安全性。 电压&#xff08;Voltage&#xff09; 电压是电场力推动电荷移动的能力&#xff0c;通常以…...

RTC、直播、点播技术对比|腾讯云/即构/声网如何选型 — 2025 版

前言 作为一个有多年实战经验的开发者&#xff0c;在音视频技术领域我深刻体会到 RTC&#xff08;实时通信&#xff09;、直播和点播三者的不同。虽然它们的核心都涉及音视频内容的传输&#xff0c;但在实际应用中&#xff0c;它们的技术实现、使用场景以及所面临的挑战各不相…...

《白帽子讲 Web 安全》之文件操作安全

目录 引言 &#xff08;一&#xff09;文件上传与下载漏洞概述 1.文件上传的常见安全隐患 1.1前端校验的脆弱性与服务端脚本执行危机在文件上传流程中&#xff0c;部分开发者可能会在前端使用 JavaScript 代码对文件后缀名进行简单校验&#xff0c;试图以此阻止非法文件上传…...

yolov8训练模型、测试视频

yolov8先训练生成best.pt文件&#xff0c;用这个生成的模型进行视频的测试 因为本来用的代码生成的测试视频打不开&#xff0c;格式应该是损坏了&#xff0c;或者部分帧没有正常保存吧。 修改了一下代码&#xff0c;现状可以正常打开生成的视频了。 1、训练代码train.py im…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...