【C语言】函数的定义、传参与调用(一)

news2025/1/11 14:25:08

 目录

导读:

1. 为什么要用函数

2. C语言中函数的分类

2.1 库函数

2.1.1 什么是库函数

2.1.2 C语言常用的库函数

2.2 自定义函数

2.2.1 什么是自定义函数

2.2.2 定义函数的方法

2.2.3 举例

 3. 函数的参数

3.1 传参不同的对比

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

3.3 解析代码

4. 函数的调用

4.1 传值调用

4.2 传址调用 

4.3 练习 

4.3.1 传值练习

4.3.2 传址练习

博主有话说


导读:

本章节我们来学习一下函数是什么,为什么要用函数,怎样取定义一个函数

相关的库函数使用可以看一下:

字符串操作函数

字符串操作函数

1. 为什么要用函数

  • 使用函数可以使代码变得模块化和更易读,同时也可以减少代码的重复性。
  • 函数可以接受参数,以便在不同的情况下执行相同的操作。在代码的其他部分需要调用这个操作时,只需要调用函数而不必重复编写代码。
  • 函数可以使代码更容易维护和测试,因为它们将相对独立的代码块隔离出来。
  • 通过使用函数,可以使代码更加清晰、简洁和易于理解。

2. C语言中函数的分类

库函数                    自定义函数

2.1 库函数

2.1.1 什么是库函数

库函数是现成的函数库中可用的函数。

这些函数通常作为程序员的工具,在编程过程中被调用使用。库函数通常包含在操作系统或者编程语言的标准库中,以便程序员方便地调用这些函数来完成特定的任务,例如字符串操作、文件操作、网络操作等。库函数经过长时间的使用和测试,已经经过优化,因此程序员可以使用这些函数来提高代码的可维护性、可读性和执行效率。

2.1.2 C语言常用的库函数

字符串操作函数:如strlen()、strcpy()、strcat()、strcmp()等

动态内存分配函数:如malloc()、calloc()、realloc()、free()等。

时间函数:如time()、asctime()、mktime()等

数学函数:如sin()、cos()、tan()、log()、exp()、sqrt()等

 注意:

使用库函数,必须包含 #include 对应的头文件。

2.2 自定义函数

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

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

2.2.1 什么是自定义函数

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

但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间

2.2.2 定义函数的方法

ret_type fun_name( para1,  *  )

{

        statement;//语句项

}

ret_type 返回类型

fun_name 函数名

para1     函数参数

2.2.3 举例

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

//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;
}

 

 3. 函数的参数

3.1 传参不同的对比

我们来看下面的代码:

写一个函数,实现交换两个整形变量的内容。

void Swap1(int x, int y)
{
	int tmp = 0;
	tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int num1 = 10;
	int num2 = 20;
	Swap1(num1, num2);
	printf("Swap1::num1 = %d num2 = %d\n", num1, num2);
	return 0;
}

我们把num1和num2传参给Swap1这个函数,x 和 y 分别来接收,让其实现两个数的交换,结构如何呢?

我们发现两个值并没有实现交换,我们换一种传参方式试一下

void Swap2(int* px, int* py)
{
	int tmp = 0;
	tmp = *px;
	*px = *py;
	*py = tmp;
}
int main()
{
	int num1 = 10;
	int num2 = 20;
	Swap2(&num1, &num2);
	printf("Swap2::num1 = %d num2 = %d\n", num1, num2);
	return 0;
}

这次我们把num1和num2的地址传给Swap2函数,让指针变量*px和*py来接收,结果又是如何呢?

成功交换!

这就是形参和实参的区别

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

形式参数:

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

实际参数: 

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

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

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

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

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

3.3 解析代码

Swap1:

我们来进入调试,查看两块代码的不同

当函数调用时,实参的值被复制到函数的形参中。

这意味着,形参在函数的局部作用域内创建,并且在函数调用结束时被销毁。

因此,在内存中,形参的值存在于函数的栈帧中,而实参的值仍然存在于调用函数的上下文中。

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

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

Swap2:

指针变量px和py存储着num1和num2的地址,改变对px和py解引用操作后,指向的就是num1和num2这片空间的值,才能实现两者的调换

4. 函数的调用

在函数调用中,参数可以通过传值调用或传址调用来传递。

4.1 传值调用

传值调用是指将实参的值复制一份传递给形参的过程。

在函数内部,对形参的任何修改都不会影响到实参。

这种方式比较简单,但是如果需要传递大量的参数或者需要频繁修改参数的值,可能会比较低效

4.2 传址调用 

传址调用是指将实参的地址传递给形参的过程。

在函数内部,可以通过该地址直接访问实参的内容。

如果对形参进行修改,就相当于对实参进行了修改,因为它们指向同一块内存。

这种方式比较高效,但是需要注意不要意外修改实参的内容。

4.3 练习 

4.3.1 传值练习

判断一个数是否是素数

int isPrime(int num) 
{
    int i;
    if (num < 2) 
    { 
        //小于 2 的数都不是素数
        return 0; // 返回 false
    }
    for (i = 2; i * i <= num; i++) 
    { 
        //从 2 开始到 sqrt(num) 循环
        if (num % i == 0) 
        { 
            // 如果可以整除,说明不是素数
            return 0; // 返回 false
        }
    }
    return 1; // 如果上述循环完毕还没有返回 false,则说明是素数,返回 true
}
int main() 
{
    int num;
    printf("请输入一个整数:");
    scanf("%d", &num);
    if (isPrime(num)) 
    {
        printf("%d是素数\n", num);
    }
    else 
    {
        printf("%d不是素数\n", num);
    }
    return 0;
}

测试:

1       3       8       9

 

4.3.2 传址练习

写一个函数,每调用一次这个函数,就会将n值增加1

void increase(int* n) 
{
    (*n)++;
}
int main() 
{
    int a = 1;
    printf("a = %d\n", a);
    increase(&a);
    printf("a = %d\n", a);
    increase(&a);
    printf("a = %d\n", a);
    return 0;
}

博主有话说

有关函数的内容今天就到这里,接下来还有函数的嵌套调用、声明和定义以及函数递归。

更多内容关注博主,掌握最新内容

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

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

相关文章

以太网基础学习(一)——以太网概述

一、以太网概述 以太网(Ethernet)指的是由 Xerox公司创建并由Xerox、Intel和 DEC公司联合开发的基带局域网规范&#xff0c;通用的以太网标准于1980年9月30日出台&#xff0c;是当今现有局域网采用的最通用的通信协议标准&#xff08;是局域网的一种&#xff09;。 以太网是一种…

libevent源码学习笔记

libevent源码学习笔记 libevent安装libevent源码解析&#xff08;1&#xff09;事件对象&#xff08;2&#xff09;事件操作&#xff08;3&#xff09;事件循环&#xff08;4&#xff09;事件处理 常用指令问题记录问题一&#xff1a;长连接的管理问题二&#xff1a;连接关闭问…

WebSocket实战之三遇上PAC

一、前言 前两天销售数据实时刷新功能开发测试完成&#xff0c;开开心心部署到生产环境&#xff0c;然后直接懵逼傻眼了&#xff0c;竟然连接不上WebSocket服务端&#xff0c;浏览器端请求头报 Provisional headers are shown 信息&#xff0c;然后采用一系列操作排查问题。 …

DS线性表之链表

前言 我们上一期介绍了顺序表&#xff0c;它的底层就是数组&#xff0c;我们也分别对顺序表的动态版本和静态版本进行了实现&#xff01;并且分析了顺序表的优缺点&#xff0c;优点是&#xff1a;尾插、尾删效率很高&#xff0c;其时间复杂度是O(1)&#xff1b;缺点是&#xff…

用于数据增强的十个Python库

数据增强是人工智能和机器学习领域的一项关键技术。它涉及到创建现有数据集的变体&#xff0c;提高模型性能和泛化。Python是一种流行的AI和ML语言&#xff0c;它提供了几个强大的数据增强库。在本文中&#xff0c;我们将介绍数据增强的十个Python库&#xff0c;并为每个库提供…

(二)激光线扫描-相机标定

1. 何为相机标定? 当相机拍摄照片时,我们看到的图像通常与我们实际看到的不完全相同。这是由相机镜头引起的,而且发生的频率比我们想象的要高。 这种图像的改变就是我们所说的畸变。一般来说,畸变是指直线在图像中出现弯曲或弯曲。 这种畸变我们可以通过相机标定来进行解…

轮询与中断

中断控制器 #include"exynos_4412.h"int main() {/*产生一个中断信号*//*1.属于外设层次&#xff0c;让外部的硬件控制器能产生一个中断信号并发送给中断控制器*//*将GPX1_1设置成中断功能*/GPX1.CON GPX1.CON |( 0xF << 4);/*设置GPX1_1中断的触发方式---下降…

栈的应用场景(一)

逆波兰表达式 1.题目2.思路3.代码 1.题目 2.思路 3.代码 class Solution {public int evalRPN(String[] tokens) {//创建一个栈Stack<Integer> stack new Stack<>();//对字符串数组进行遍历for(String x : tokens){//分数操作符和操作数两种情况,我们得判断//一下…

JavaScript系列从入门到精通系列第十二篇:JavaScript中对象的简介和对象的基本操作以及JavaScript中的属性值和属性名

文章目录 前言 一&#xff1a;对象分类 1&#xff1a;内建对象 2&#xff1a;宿主对象 3&#xff1a;自建对象 二&#xff1a;对象的基本操作 1&#xff1a;创建对象 2&#xff1a;向对象中添加属性 3&#xff1a;读取对象中的属性 4&#xff1a;修改对象中的属性 三…

使用晶体管做布尔逻辑和逻辑门

目录 二进制&#xff0c;三进制&#xff0c;五进制 true&#xff0c;false表示0&#xff0c;1 早期计算机采用进制 布尔逻辑 三个基本操作&#xff1a;NOT,AND,OR 基础“真值表” NOT 如何实现&#xff1f; AND如何实现&#xff1f; OR如何实现&#xff1f; 图标表示…

算法——买卖股票问题

309. 买卖股票的最佳时机含冷冻期 - 力扣&#xff08;LeetCode&#xff09; 一、 究其就是个动态规划的问题 算法实现图 初始化 由于有三个阶段&#xff0c;买入&#xff0c;可交易&#xff0c;冷冻期&#xff0c;那么用dp表表示现在为止的最大利润&#xff0c;则有 dp[0][…

基于Redis实现消息队列的实践

为什么要基于Redis实现消费队列&#xff1f; 消息队列是一种典型的发布/订阅模式&#xff0c;是专门为异步化应用和分布式系统设计的&#xff0c;具有高性能、稳定性及可伸缩性的特点&#xff0c;是开发分布式系统和应用系统必备的技术之一。目前&#xff0c;针对不同的业务场…

WebSocket实战之四WSS配置

一、前言 上一篇文章WebSocket实战之三遇上PAC &#xff0c;碰到的问题只能上安全的WebSocket&#xff08;WSS&#xff09;才能解决&#xff0c;配置证书还是挺麻烦的&#xff0c;主要是每年都需要重新更新证书&#xff0c;我配置过的证书最长有效期也只有两年&#xff0c;搞不…

由于计算机中丢失msvcp110.dll的解决方法与msvcp110.dll丢失修复方法

相信大家在打开电脑软件或许游戏都有遇到过电脑提示找不到msvcp110.dll文件&#xff0c;导致软件游戏打不开&#xff0c;我们应该怎么办&#xff1f;不用着急&#xff0c;今天小编我分享我找了很久成功解决问题的方法给大家&#xff0c;希望可以帮到各位。 1. 使用DLL修复工具&…

python——Django框架

一、基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 使用 Django&#xff0c;只要很少的代码&#xff0c;Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容&#xff0c;并进一步开发出全功能的 Web 服务 Django 本身基于 MVC …

简单的考试系统

开发一个简单的考试系统&#xff0c;在HTML页面中建立一个表单&#xff0c;通过post方法传递参数。题目类型包括单选题、多选题和填空题&#xff0c;要求程序给出考试成绩。 <!DOCTYPE html> <html> <head><title>question.html</title><met…

SpringBoot banner 样式 自动生成

目录 SpringBoot banner 样式 自动生成 图案网站&#xff1a; 1.第一步创建banner.txt文件 2.访问网站Ascii艺术字实现个性化Spring Boot启动banner图案&#xff0c;轻松修改更换banner.txt文件内容&#xff0c;收集了丰富的banner艺术字和图&#xff0c;并且支持中文banner下…

【C语言】文件操作(三)

前言 在文件操作&#xff08;二&#xff09;中我们学习了顺序读写文件的函数&#xff0c;在这篇博客中我们将学习⽂件的随机读写&#xff0c;⽂件读取结束的判定。 文章目录 一、文件的随机读写1.1 fseek1.2 ftell1.3 rewind 二、文件读取结束的判定2.1 ferror和feof 三、文件缓…

键盘上F1至F12键的作用

多年来&#xff0c;我们习惯了最上排的12个按键&#xff0c;从F1到F12&#xff0c;它们被称为“快速功能键”&#xff0c;可以让你更轻松地操作电脑&#xff1b;但是&#xff0c;很多人可能从未使用过它们&#xff0c;也从来不知道它们的用途。那么今天&#xff0c;就向大家科普…

【Pytorch笔记】4.梯度计算

深度之眼官方账号 - 01-04-mp4-计算图与动态图机制 前置知识&#xff1a;计算图 可以参考我的笔记&#xff1a; 【学习笔记】计算机视觉与深度学习(2.全连接神经网络) 计算图 以这棵计算图为例。这个计算图中&#xff0c;叶子节点为x和w。 import torchw torch.tensor([1.]…