初识C语言——函数

news2024/11/25 16:28:58

目录

一、库函数

 二、自定义函数

三、函数的参数

四 、函数的调用

1 、传值调用

2 、传址调用

五、函数的嵌套调用和链式访问

六、函数的声明和定义

        1 函数声明:

        2 函数定义:

七、函数的递归与迭代

八、总结


一、库函数

        库函数查询网站:www.cplusplus.com

        

注:
        但是库函数必须知道的一个秘密就是:使用库函数,必须包含 #include 对应的头文件。
这里对照文档来学习上面几个库函数,目的是掌握库函数的使用方法。

 二、自定义函数

格式:

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

注:1、如果不返回值时,使用void。

        2、如果不写返回类型,则默认返回int类型。

代码示例:

#include <stdio.h>
//实现成函数,但是不能完成任务
void Swap1(int x, int y)
{
 int tmp = 0;
 tmp = x;
 x = y;
 y = tmp;
}
//正确的版本
void Swap2(int *px, int *py)
{
 int tmp = 0;
 tmp = *px;
 *px = *py;
 *py = tmp;
}
int main()
{
 int num1 = 1;
 int num2 = 2;
 Swap1(num1, num2);
 printf("Swap1::num1 = %d num2 = %d\n", num1, num2);
 Swap2(&num1, &num2);
 printf("Swap2::num1 = %d num2 = %d\n", num1, num2);
 return 0;
}

        请对比上面2串代码,我们可以发现二个函数,传入的参数不相同。

三、函数的参数

1、实际参数(实参):
        真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。 无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参

2、形式参数(形参):

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

我们可以对比上面二个函数:

 形参实例化之后其实相当于实参的一份临时拷贝

四 、函数的调用

1 、传值调用

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

2 、传址调用

        传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操
作函数外部的变量。
同样我们用上面的两串代码来进行对比:

 

五、函数的嵌套调用和链式访问

        函数可以根据实际情况进行嵌套调用和链式访问。

        嵌套调用:函数可以嵌套调用,但是不能嵌套定义。

        链式访问:把一个函数的返回值作为另外一个函数的参数。

示例:

#include <stdio.h>
void new_line()
{
 printf("hehe\n");
}
void three_line()
{
    int i = 0;
 for(i=0; i<3; i++)
   {
        new_line();
   }
}
int main()
{
 three_line();
 return 0;
}

六、函数的声明和定义

1 函数声明:

  • 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。
  • 函数的声明一般出现在函数的使用之前。要满足先声明后使用
  • 函数的声明一般要放在头文件中的。

2 函数定义:

        函数的定义是指函数的具体实现,交待函数的功能实现。

test.h 的内容
放置函数的声明
#ifndef __TEST_H__
#define __TEST_H__
//函数的声明
int Add(int x, int y);
#endif //__TEST_H__
test.c 的内容
放置函数的实现
#include "test.h"
//函数Add的实现
int Add(int x, int y)
{
 return x+y;
}

七、函数的递归与迭代

实现n的阶乘。(不考虑溢出)

参考代码

int factorial(int n)
{
 if(n <= 1)
 return 1;
 else
 return n * factorial(n-1);
}

        上面这个函数就使用了递归的思想,但是如果n的值如果很大的话,将会发生程序崩溃等问题。

        因此,我们引入了一个概念:

        系统分配给程序的栈空间是有限的,但是如果出现了死循环,或者(死递归),这样有可能导致一 直开辟栈空间,最终产生栈空间耗尽的情况,这样的现象我们称为栈溢出。
        所以为了避免 栈溢出,推荐使用迭代。
注:
解决上述的问题:
        1. 将递归改写成非递归。
        2. 使用 static 对象替代 nonstatic 局部对象。在递归函数设计中,可以使用 static 对象替代nonstatic 局部对象(即栈对象),这不仅可以减少每次递归调用和返回时产生和释放 nonstatic 对象的开销,而且 static 对象还可以保存递归调用的中间状态,并且可为各个调用层所访问。

示例:

int factorial(int n)
{
        int result = 1;
        while (n > 1)
       {
             result *= n ;
             n -= 1;
       }
        return result;
}

八、总结

        合理的使用函数,可以大大的节约我们的空间,以及降低代码出现的次数、复杂度等。

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

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

相关文章

浅谈智慧城市管廊综合管理平台的建设

摘 要&#xff1a;随着智慧城市的发展&#xff0c;地下综合管廊的建设不断增多&#xff0c;建成后的管廊需要有科学合理的综合管理平台对其进行智能化管理。本文介绍了地下综合管廊的建设内容&#xff0c;从管廊智能化管理角度出发&#xff0c;在运用GIS、可视化、传感器、物联…

多线程服务器

设计一个客户端从服务器端获取时间的程序&#xff1a; 服务器端使用多线程的方式&#xff0c;当有客户端请求到达时&#xff0c;服务器将启动一个新线程为它返回当前的时间&#xff0c;服务完后线程自动销毁&#xff0c;服务器端会显示连接的次数。 客户端比较简单&#xff0c;…

MySQL安装手册

文章目录一、系统环境二、检查是否已安装三、安装步骤1、yum安装1.1、更新yum1.2、使用wget下载mysql yum源&#xff1a;1.3、添加 mysql yum 源:1.4、安装 yum 工具 yum-utils :1.5、查看可用的 mysql :1.6、查看所有的 mysql 版本1.7、使用指定版本MySQL1.8、查看当前启用的M…

Netty源码解读-server端(一)

一、回顾NIO中的server 下面是我在学习nio时&#xff0c;写的selctor版本的服务端&#xff0c;具体代码如下&#xff1a; public static void nioSelectorServer() throws Exception{//1。创建SelectorSelector selector Selector.open();ServerSocketChannel ssc ServerSo…

c++ bind 函数讲解

1.bind 函数的使用详解 可以将bind函数看作一个通用的函数适配器&#xff0c;它接受一个可调用对象&#xff0c;生成一个新的可调用对象来“适应”原对象的参数列表。 调用bind的一般形式&#xff1a;auto newCallable bind(callable,arg_list); 其中&#xff0c;newCallab…

从零实现深度学习框架——再探多层双向RNN的实现

来源&#xff1a;投稿 作者&#xff1a;175 编辑&#xff1a;学姐 往期内容&#xff1a; 从零实现深度学习框架1&#xff1a;RNN从理论到实战&#xff08;理论篇&#xff09; 从零实现深度学习框架2&#xff1a;RNN从理论到实战&#xff08;实战篇&#xff09; 从零实现深度…

【Vue3】首页主体-面板组件封装

首页主体-面板组件封装 新鲜好物、人气推荐俩个模块的布局结构上非常类似&#xff0c;我们可以抽离出一个通用的面板组件来进行复用 目标&#xff1a;封装一个通用的面板组件 思路分析 图中标出的四个部分都是可能会发生变化的&#xff0c;需要我们定义为可配置主标题和副标题…

您可以使用 21 个很棒的搜索引擎来代替 Google

在过去的 20 年里&#xff0c;Google 一直是大多数人用于日常搜索、产品研究和了解最新消息的搜索引擎。凭借其长期的统治地位和大部分市场份额&#xff0c;很难说任何搜索引擎都能提供比谷歌更好的结果。由于这种市场主导地位&#xff0c;谷歌也一直是SEO和营销专业人士关注的…

随笔-老子不想牺牲了

18年来到这个项目组&#xff0c;当时只有8个人&#xff0c;包括经常不在的架构师和经理。当时的工位在西区1栋A座&#xff0c;办公桌很宽敞。随着项目的发展&#xff0c;入职的人越来越多&#xff0c;项目的工位也是几经搬迁。基本上每次搬迁时&#xff0c;我的工位都是挑剩下的…

Allegro如何实现同一个屏幕界面分屏显示操作指导

Allegro如何实现同一个屏幕界面分屏显示操作指导 在做PCB设计的时候,会需要分屏显示,比如一边是放大的视图,另外一边是缩小的视图,Allegro支持同一个屏幕界面下进行分屏显示,如下图 而且会实时同步起来 如何分屏,具体操作如下 点击View

(python)降低图像质量

降低数字图像质量(python实现) 目录 降低数字图像质量(python实现)一、分别采用五种不同的方式来降低图像的质量1. 给图像添加椒盐噪声2. 给图像添加高斯噪声3. 对图像进行高斯模糊4. 对图像进行运动模糊5. 对图像进行插值下采样二、实现代码一、分别采用五种不同的方式来降…

操作系统(六)磁盘调度算法与优化

操作系统&#xff08;六&#xff09;磁盘调度算法与优化 一、磁盘调度算法 时间指标 寻找时间&#xff1a;在读/写数据前&#xff0c;将磁头移动到指定磁道需要的时间延迟时间&#xff1a;通过旋转盘面&#xff0c;将磁头定位到目标扇区所需的时间传输时间&#xff1a;从磁盘…

Leetcode.1124 表现良好的最长时间段

题目链接 Leetcode.1124 表现良好的最长时间段 Rating &#xff1a; 1908 题目描述 我们认为当员工一天中的工作小时数大于 8 小时的时候&#xff0c;那么这一天就是「劳累的一天」。 所谓「表现良好的时间段」&#xff0c;意味在这段时间内&#xff0c;「劳累的天数」是严格…

argocd 调研

Argo CD 是基于 Kubernetes 的声明式&#xff0c; GitOps 持续交付工具。GitOps AgentGitOps IaC Git CI/CD&#xff0c;即基于 IaC 的版本化 CI/CD。它的核心是使用 Git 仓库来管理基础设施和应用的配置&#xff0c;并且以 Git 仓库作为基础设施和应用的单一事实来源。Git …

Windows 11 办公实用效率小技巧总结(持续更新)

Win11 办公实用效率小技巧总结:1. 虚拟桌面2. 拖拽任务窗口转移到不同虚拟桌面3. 自定义多网页名称4. Focus专注组件5. 多选项分屏6. 抖一抖最小化1. 虚拟桌面 虽然过去只有 Linux&#xff0c; Mac 系统中有虚拟桌面&#xff0c;而且在win10 中也实现了这个功能&#xff0c;但…

Springboot835学生成绩分析系统--java

开发语言&#xff1a;Java 框架&#xff1a;Springboot 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 目 录 1 绪 论 5 1.1课题背景 5 1.2 课题研究的意义 5 1.3 系统实现的功能 5 1.4 课题研究现状 5 2系统相关技术 7 2.1 Java技术 7 2.2 B/S架构 7 2.3 MySQL 介绍 7 2.4My…

zabbix邮件报警配置

在Zabbix服务端设置邮件报警&#xff0c;当被监控主机宕机或者达到触发器预设值时&#xff0c;会自动发送报警邮件到指定邮箱。 邮件服务可以使用系统自带的邮件服务来发送邮件或者使用其他邮件服务调用第三方邮件来发送警告邮件。 一、开启发件服务器SMTP功能 这里发送邮件的…

初始C++(四):内联函数

文章目录一.内联函数概念二.内联函数用法三.内联函数的特性四.内联函数和宏一.内联函数概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 二.内联函…

SpringBoot环境-MySQL主从复制,读写分离的实现

目录 概述 环境 主从复制 读写分离 概述 记录在MySQL数据库中主从复制以及SpringBoot环境操作MySQL数据库读写分离的实现步骤。 背景 &#xff1a;因为我们在对数据库进行操作时&#xff0c;如果读写操作都由一台数据库承担的话压力会比较大&#xff0c;为了减轻数据库压力&…

【Linux】rsyslog日志服务(配置,测试、日志转储)

一、rsyslog简介 Rsyslog的全称是 rocket-fast system for log ,可用于接受来自各种来源的输入&#xff0c;转换 它们&#xff0c;并将结果输出到不同的目的地。 它提供了高性能、强大的安全功能和模块化设计。虽然rsyslog最初是一个常规的系 统日志&#xff0c;但它已经发展成…