C语言函数—自定义函数


如果库函数能干所有的事情,那还要程序员干什么?

所有更加重要的是自定义函数

自定义函数和库函数一样,有函数名,返回值类型和函数参数。

但是不一样的是这些都是我们自己来设计。

这给程序员一个很大的发挥空间。

函数的组成

ret_type fun_name(para1, * )
//函数的返回类型 函数名(传入参数)
{
 statement;//语句项
}
ret_type 返回类型
fun_name 函数名
para1    函数参数

我们举一个例子:

写一个函数可以找出两个整数中的最大值。

#include <stdio.h>
//get_max函数的设计
int get_max(int x, int y)
{
	return (x > y) ? (x) : (y);
}
int main()
{
	int num1 = 10;
	int num2 = 20;
	int max = get_max(num1, num2);
	printf("max = %d\n", max);
	return 0;
} 

我们来看一个例子

//函数返回类型的地方写出:void,表示这个函数不返回任何值,也不需要返回
//写出问题了!
void Swap(int x, int y)
{
	int z = 0;
	z = x;
	x = y;
	y = z;
}

int main()
{
	int a = 10;
	int b = 20;
	//写一个函数 - 交换2个整型变量的值

	printf("交换前:a=%d b=%d\n", a, b);
	Swap(a, b);
	printf("交换后:a=%d b=%d\n", a, b);

	return 0;
}

为什么没有交换?因为只有函数里的参数交换了,实际上主函数的两个值并没有受影响

该怎么办

//swap1在被调用的时候,实参传给形参,其实形参是实参的一份临时拷贝
//改变形参,不能改变实参
void Swap1(int x, int y)
{
	int z = 0;
	z = x;
	x = y;
	y = z;
}

void Swap2(int* pa, int* pb)//
{
	int z = 0;
	z = *pa;
	*pa = *pb;
	*pb = z;
}

int main()
{
	int a = 10;
	int b = 20;
	//写一个函数 - 交换2个整型变量的值

	Swap1(a, b);//传值调用
	printf("交换前:a=%d b=%d\n", a, b);
	Swap2(&a, &b);//传址调用
	printf("交换后:a=%d b=%d\n", a, b);

	return 0;
}

为什么呢,我们来看函数参数的具体介绍

函数的参数

实际参数(实参)

真实传给函数的参数,叫实参。

实参可以是:常量、变量、表达式、函数等。

无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形 参。

形式参数(形参)

形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内 存单 元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有 效。

上面 Swap1 和 Swap2 函数中的参数 x,y,px,py 都是形式参数

在main函数中传给 Swap1 的 num1 , num2 和传 给 Swap2 函数的 &num1 , &num2 是实际参数。

这里我们对函数的实参和形参进行分析:

image-20240313170338670

这里可以看到 Swap1 函数在调用的时候, x , y 拥有自己的空间,同时拥有了和实参一模一样的内容。

所以我们可以简单的认为:形参实例化之后其实相当于实参的一份临时拷贝。

传值调用

函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。

传址调用

  • 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
  • 这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操 作函数外部的变量。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第十四届蓝桥杯蜗牛

蜗牛 线性dp 目录 蜗牛 线性dp 先求到达竹竿底部的状态转移方程 求蜗牛到达第i根竹竿的传送门入口的最短时间​编辑 题目链接&#xff1a;蓝桥杯2023年第十四届省赛真题-蜗牛 - C语言网 关键在于建立数组将竹竿上的每个状态量表示出来&#xff0c;并分析出状态转移方程 in…

在Linux中进行OpenSSH升级

由于OpenSSH有严重漏洞&#xff0c;因此需要升级OpenSSH到最新版本。 OpenSSL和OpenSSH都要更新&#xff0c;OpenSSH依赖于OpenSSL。 第一步&#xff0c;查看当前的OpenSSH服务版本。 命令&#xff1a;ssh -V 第二步&#xff0c;安装、启动telnet&#xff0c;关闭安全文件&a…

免费AI软件开发工具测评:iFlyCode VS CodeFlying

前言 Hello&#xff0c;各位看官&#xff0c;今天为大家带来两款人工智能的软件开发工具的测评&#xff0c;他们分别是iFlyCode和CodeFlying&#xff0c;我相信当大家看到这两款产品名字的时候不禁都会有些好奇&#xff0c;两个产品都有Code 和Fly两个元素&#xff0c;那他们之…

Python语言在编程业界的地位——《跟老吕学Python编程》附录资料

Python语言在编程业界的地位——《跟老吕学Python编程》附录资料 ⭐️Python语言在编程业界的地位2024年3月编程语言排行榜&#xff08;TIOBE前十&#xff09; ⭐️Python开发语言开发环境介绍1.**IDLE**2.⭐️PyCharm3.**Anaconda**4.**Jupyter Notebook**5.**Sublime Text** …

若依上传文件/common/upload踩坑

前言&#xff1a;作者用的mac系统&#xff08;这个是个坑&#xff09;&#xff0c;前端用的uniapp&#xff0c;调用若依通用上传方法报错NoSuchFileException: /home/ruoyi/uploadPath/upload... 前端上传代码示例如下: uni.chooseImage({count: 1,success(res){ uni.uploa…

在centos8中部署Tomcat和Jenkins

参考链接&#xff1a;tomcat安装和部署jenkins_jenkins和tomcat-CSDN博客 1、进入centos中 /usr/local 目录文件下 [rootlocalhost webapps]# cd /usr/local2、使用通过wget命令下下载tomcat或者直接在官网下载centos版本的包后移动到centos中的local路径下 3、下载tomcat按…

1307页字节跳动Android面试全套真题解析在互联网火了-,完整版开放下载

多进程带来的问题 AIDL 使用浅析binder 原理解析binder 最底层解析多进程通信方式以及带来的问题多进程通信方式对比 Android 高级必备 &#xff1a;AMS,WMS,PMS AMS,WMS,PMS 创建过程 AMS,WMS,PMS全解析AMS启动流程WindowManagerService启动过程解析PMS 启动流程解析 A…

PyTorch之完整的神经网络模型训练

简单的示例&#xff1a; 在PyTorch中&#xff0c;可以使用nn.Module类来定义神经网络模型。以下是一个示例的神经网络模型定义的代码&#xff1a; import torch import torch.nn as nnclass MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()# 定义神经…

DPN网络

DPN DPN&#xff08;Dual Path Networks&#xff09;是一种网络结构&#xff0c;它结合了DensNet和ResNetXt两种思想的优点。这种结构的目的是通过不同的路径来利用神经网络的不同特性&#xff0c;从而提高模型的效率和性能。 DenseNet 的特点是其稠密连接路径&#xff0c;使…

【Python】新手入门学习:详细介绍开放封闭原则(OCP)及其作用、代码示例

【Python】新手入门学习&#xff1a;详细介绍开放封闭原则&#xff08;OCP&#xff09;及其作用、代码示例 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyT…

「哈哥赠书活动 - 50期」-『AI赋能写作:AI大模型高效写作一本通』

⭐️ 赠书 - 《AI赋能写作&#xff1a;AI大模型高效写作一本通》 ⭐️ 内容简介 本书以ChatGPT为科技行业带来的颠覆性革新为起点&#xff0c;深入探讨了人工智能大模型如何为我们的创作提供强大支持。本书旨在帮助创作者更好地理解AI的价值&#xff0c;并充分利用其能力提升写…

复习C的内存管理

来自&#xff1a;漫谈C语言内存管理_c语言内存管理机制-CSDN博客 C语言学习笔记 —— 内存管理_c语言内存管理-CSDN博客 C语言是音视频开发所必须的。 变量是一段连续内存空间的别名。变量的类型是固定内存大小的别名。但是类型不是只确定了变量内存大小&#xff0c;还确定了…

代码随想录-java-栈与队列总结

栈&#xff08;Stack&#xff09;&#xff1a;是只允许在一端进行插入或删除的线性表。栈是一种线性表&#xff0c;限定这种线性表只能在某一端进行插入和删除操作。进行操作的这一端称为栈顶。 队列&#xff08;Queue&#xff09;是只允许在一端进行插入操作&#xff0c;而在另…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TextPicker)

滑动选择文本内容的组件。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 TextPicker(options?: {range: string[] | string[][] | Resource | TextPickerRangeContent[] | Te…

自动生成单元测试、外挂开源代码库等新功能,上线JetBrains IDEs的CodeGeeX插件!

CodeGeeX第三代模型发布后&#xff0c;多项基于第三代模型能力的新功能今天也同步上线JetBrains IDEs全家桶。 用户可以在IDEA、PyCharm等JetBrains系的IDE中&#xff0c;搜索下载CodeGeeX v2.5.0版本&#xff0c;深度使用最新功能。 一、新模型加持的代码补全和智能问答 …

【Java基础概述-8】Lambda表达式概述、方法引用、Stream流的使用

1、Lambda表达式概述 什么是Lambda表达式? Lambda表达式是JDK1.8之后的新技术&#xff0c;是一种代码的新语法。 是一种特殊写法。 作用&#xff1a;“核心的目的是为了简化匿名内部类的写法”。 Lambda表达式的格式&#xff1a; (匿名内部类被重写的形参列表){ 被重写的代码 …

[MYSQL数据库]--表内操作(CURD)

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、表的 Cre…

AI时代Python金融大数据分析实战:ChatGPT让金融大数据分析插上翅膀【文末送书-38】

文章目录 Python驱动的金融智能&#xff1a;数据分析、交易策略与风险管理Python在金融数据分析中的应用 实战案例&#xff1a;基于ChatGPT的金融事件预测AI时代Python金融大数据分析实战&#xff1a;ChatGPT让金融大数据分析插上翅膀【文末送书-38】 Python驱动的金融智能&…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TimePicker)

时间选择组件&#xff0c;根据指定参数创建选择器&#xff0c;支持选择小时及分钟。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 TimePicker(options?: TimePickerOptions)…

【计算机网络】HTTPS协议

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;网络原理&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 HTTPS是什么&#xff1f; 为什么要加密&#xff1f; …