c语言函数(详解)

目录

前言

一、函数的基本概念和作用

二、函数的声明和定义

三、函数参数的传递方式

四、函数的递归

五、函数指针

总结


前言

本文主要讲解了c语言函数方面的内容


    • 函数的定义和调用
    • 函数的返回值和参数
    • 函数的作用域和生命周期
  1. 函数的声明和定义

    • 函数声明和函数定义的区别
    • 函数声明的语法规则
    • 函数定义的语法规则
  2. 函数参数的传递方式

    • 值传递
    • 引用传递
    • 指针传递
  3. 函数的递归

    • 递归的基本概念和原理
    • 递归函数的编写和调用
    • 递归和迭代的比较
  4. 函数的重载

    • 函数重载的概念和作用
    • 函数重载的语法规则
    • 函数重载的实际应用
  5. 内联函数

    • 内联函数的概念和作用
    • 内联函数的使用方法
    • 内联函数的优缺点
  6. 函数指针

    • 函数指针的概念和作用
    • 函数指针的声明和使用
    • 函数指针和回调函数的应用
  7. 变长参数函数

    • 变长参数函数的概念和作用
    • 变长参数函数的声明和使用
    • 变长参数函数的应用案例
  8. 常见的标准函数库

    • 数学函数库
    • 字符串处理函数库
    • 文件操作函数库
    • 时间和日期函数库
  9. 错误处理和异常处理

    • 错误处理的概念和目的
    • 错误处理的方法和技巧
    • 异常处理的概念和使用方法

一、函数的基本概念和作用

      函数是一段封装了特定功能的代码块。它们用来组织和重用代码,使程序更易于理解和维护。函数可以接受输入参数,并且可以返回一个值。

        函数的定义是指我们编写的函数代码块,它包括函数名、参数列表、返回类型和函数体。函数名用于标识函数,在调用函数时使用。参数列表指定了函数接受的输入参数的类型和名称。返回类型指定了函数返回值的类型。函数体是实际执行的代码。

       函数的调用是指使用函数名和传递给函数的参数列表来执行函数。调用函数时,程序将跳转到函数体,并执行其中的代码。函数执行完毕后,程序将返回到函数调用的位置继续执行。

         函数的返回值用于将结果从函数传递回调用函数的位置。返回值的类型必须与函数的返回类型相符。在函数体中,我们可以使用关键字return来返回一个值。调用函数时,我们可以将返回值赋值给一个变量,或者直接使用返回值。

       函数的参数是在调用函数时传递给函数的值。参数可以是原始数据类型,也可以是对象或数组等复合数据类型。参数在函数体内部作为变量使用。函数可以有多个参数,它们以逗号分隔。

       函数的作用域是指函数体内部定义的变量的可见范围。函数体内部可以访问外部定义的变量,但是外部不能访问函数体内部定义的变量。函数的作用域可以是全局的,也可以是局部的。

       函数的生命周期是指函数在程序中存在的时间段。函数在定义时创建,调用时执行,执行完毕后销毁。函数的生命周期可以由函数的作用域和调用方式决定。

二、函数的声明和定义

       函数的声明和定义指的是在程序中告诉编译器函数的名称、返回类型和参数列表以便在程序中使用该函数的过程。

       函数声明是在程序中使用函数之前告诉编译器函数的名称、返回类型和参数列表。函数声明只是告诉编译器函数的存在,并没有具体的函数体。

        函数定义是在程序中具体实现函数的功能,包括函数的函数体。函数定义提供了函数的实际操作。

函数声明的语法规则: 返回类型 函数名(参数列表);

函数定义的语法规则: 返回类型 函数名(参数列表) { // 函数体 // 函数的实际操作 }

例如,下面是一个函数声明和定义的例子:

函数声明: int add(int a, int b);函数定义: int add(int a, int b) { return a + b; }

在函数声明中,告诉编译器有一个函数叫做add,返回类型是int,有两个int类型的参数a和b。

在函数定义中,实现了add函数的具体功能,计算a和b的和,并将结果返回。

三、函数参数的传递方式

函数参数的传递方式有三种:

  1. 值传递:将参数的值复制一份传递给函数,在函数内部对参数进行修改不会影响到外部的变量。

  2. 引用传递:将参数的引用(内存地址)传递给函数,函数可以直接修改参数所指向的变量的值,从而影响到外部的变量。

  3. 指针传递:将参数的指针(地址)传递给函数,函数可以通过指针访问并修改参数所指向的变量的值,从而影响到外部的变量。

代码演示:

值传递: #include <stdio.h>void changeValue(int num) { num = 10; }int main() { int num = 5; changeValue(num); printf("%d\n", num); // 打印结果是5,num在changeValue函数中的修改不会影响到外部的变量 return 0; }引用传递: #include <stdio.h>void changeValue(int* numPtr) { *numPtr = 10; }int main() { int num = 5; changeValue(&num); // 传递num的地址 printf("%d\n", num); // 打印结果是10,changeValue函数内部修改了num的值 return 0; }指针传递: #include <stdio.h>void changeValue(int* numPtr) { *numPtr = 10; }int main() { int num = 5; int* ptr = # // 声明一个指向int类型的指针,存储num的地址 changeValue(ptr); // 传递指针ptr的值 printf("%d\n", num); // 打印结果是10,changeValue函数内部通过指针修改了num的值 return 0; }
四、函数的递归

       递归的基本概念和原理: 递归是指一个函数调用自己或者调用其他函数时,该函数又调用该函数的过程。它是一种解决问题的有效方法,它把一个大问题分解成了一个或多个相同或相似的子问题,然后递归地解决这些子问题,最后合并得到原问题的解。

        递归函数的编写和调用: 编写递归函数时,需要定义递归函数的终止条件,即递归的基本情况。当递归函数的输入满足终止条件时,递归停止,返回结果。否则,递归函数调用自身,并将问题规模缩小,直到满足终止条件。

       递归和迭代的比较: 递归和迭代都是循环的方法,但它们的实现方式不同。递归是通过函数的调用来实现循环,而迭代是通过循环结构来实现循环。递归的代码通常比迭代的代码简洁,但它的效率较低,因为每次递归都需要调用函数并保存调用的状态。

代码例子:

#include <stdio.h>int factorial(int n){// 终止条件if(n == 0){return 1;}// 递归调用return n * factorial(n-1);
}int main(){int n = 5;int result = factorial(n);printf("Factorial of %d is %d\n", n, result);return 0;
}

       这段的代码中,factorial函数通过递归的方式计算阶乘。当输入为0时,递归停止,返回结果1。否则,递归调用函数,将问题规模缩小,并与当前的n相乘。最后,递归函数返回结果,得到阶乘的结果。在main函数中,我们调用factorial函数来计算5的阶乘,并打印结果。输出结果为:Factorial of 5 is 120。

五、函数指针

   

      函数指针是指向函数的指针变量。它可以指向特定参数和返回类型的函数,并且可以通过函数指针来调用该函数。函数指针可以被用来作为函数的参数、返回值或者在运行时动态调用函数。

函数指针的声明使用以下语法:

返回类型 (*指针变量名)(参数列表);

其中,指针变量名可以是任意合法的标识符,它指向具有返回类型和参数列表的函数。

函数指针的使用可以通过以下步骤进行:

  1. 声明函数指针,并指定它所指向的函数的返回类型和参数列表。
  2. 将函数的地址赋值给函数指针。
  3. 通过函数指针来调用函数。

代码演示:

#include <stdio.h>int add(int a, int b) {return a + b;
}int subtract(int a, int b) {return a - b;
}int main() {int (*operation)(int, int); // 声明函数指针int result;operation = add; // 将函数地址赋给函数指针result = operation(10, 5); // 通过函数指针调用函数printf("Addition result: %d\n", result);operation = subtract; // 将另一个函数地址赋给函数指针result = operation(10, 5); // 再次通过函数指针调用函数printf("Subtraction result: %d\n", result);return 0;
}

       函数指针和回调函数的应用是在某个函数中传递另一个函数的指针作为参数,然后在需要的时候调用这个函数指针。这种机制可以实现灵活的函数调用,特别适用于事件驱动的程序设计。

代码示例:

#include <stdio.h>// 回调函数的定义
void message() {printf("Hello, World!\n");
}// 接受函数指针作为参数的函数
void printMessage(void (*callback)()) {callback();
}int main() {// 将回调函数的地址传递给函数指针printMessage(message);return 0;
}

       以上代码中,printMessage函数接受一个函数指针作为参数,然后在需要的时候调用这个函数指针。在main函数中,将message函数的地址作为参数传递给printMessage函数,从而实现了回调函数的功能。


总结

 以上就是c语言函数的内容啦,后续我会带来更多实用的内容,感兴趣的可以点个赞支持一下!

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

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

相关文章

Linux学习笔记——网络管理命令

一、网络基础知识 TCP/IP四层模型 以太网地址&#xff08;MAC地址&#xff09;&#xff1a; 段16进制数据 IP地址&#xff1a; 子网掩码&#xff1a; 二、接口管命令 ip命令&#xff1a;字符终端&#xff0c;立即生效&#xff0c;重启配置会丢失 nmcli命令&#xff1a;字符…

手撕Diffusion系列 - 第九期 - 改进为Stable Diffusion(原理介绍)

手撕Diffusion系列 - 第九期 - 改进为Stable Diffusion&#xff08;原理介绍&#xff09; 目录 手撕Diffusion系列 - 第九期 - 改进为Stable Diffusion&#xff08;原理介绍&#xff09;DDPM 原理图Stable Diffusion 原理Stable Diffusion的原理解释Stable Diffusion 和 Diffus…

JAVAweb学习日记(八) 请数据库模型MySQL

一、MySQL数据模型 二、SQL语言 三、DDL 详细见SQL学习日记内容 四、DQL-条件查询 五、DQL-分组查询 聚合函数&#xff1a; 分组查询&#xff1a; 六、DQL-分组查询 七、分页查询 八、多表设计-一对多&一对一&多对多 一对多-外键&#xff1a; 一对一&#xff1a; 多…

微信小程序1.1 微信小程序介绍

1.1 微信小程序介绍 内容提要 1.1 什么是微信小程序 1.2 微信小程序的功能 1.3 微信小程序使用场景 1.4 微信小程序能取代App吗 1.5 微信小程序的发展历程 1.6微信小程序带来的机会

音频入门(一):音频基础知识与分类的基本流程

音频信号和图像信号在做分类时的基本流程类似&#xff0c;区别就在于预处理部分存在不同&#xff1b;本文简单介绍了下音频处理的方法&#xff0c;以及利用深度学习模型分类的基本流程。 目录 一、音频信号简介 1. 什么是音频信号 2. 音频信号长什么样 二、音频的深度学习分…

Midjourney中的强变化、弱变化、局部重绘的本质区别以及其有多逆天的功能

开篇 Midjourney中有3个图片“微调”&#xff0c;它们分别为&#xff1a; 强变化&#xff1b;弱变化&#xff1b;局部重绘&#xff1b; 在Discord里分别都是用命令唤出的&#xff0c;但如今随着AI技术的发达在类似AI可人一类的纯图形化界面中&#xff0c;我们发觉这样的逆天…

【Linux】命令为桥,存在为岸,穿越虚拟世界的哲学之道

文章目录 Linux基础入门&#xff1a;探索操作系统的内核与命令一、Linux背景与发展历史1.1 Linux的起源与发展1.2 Linux与Windows的对比 二、Linux的常用命令2.1 ls命令 - "List"&#xff08;列出文件)2.2 pwd命令 - "Print Working Directory"&#xff08…

[护网杯 2018]easy_tornado1

题目 、 依次点击文件查看 /flag.txt flag in /fllllllllllllag /welcome.txt render /hints.txt md5(cookie_secretmd5(filename)) tornado模板注入 报cookie /error?msg{{handler.settings}} cookie_secret: 6647062b-e68d-4406-90d3-06e307fa955c} 使用python脚本…

STM32+W5500+以太网应用开发+003_TCP服务器添加OLED(u8g2)显示状态

STM32W5500以太网应用开发003_TCP服务器添加OLED&#xff08;u8g2&#xff09;显示状态 实验效果3-TCP服务器OLED1 拷贝显示驱动代码1.1 拷贝源代码1.2 将源代码添加到工程1.3 修改代码优化等级1.4 添加头文件路径1.5 修改STM32CubeMX工程 2 修改源代码2.1 添加头文件2.2 main函…

基于微信小程序的英语学习交流平台设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

ORB-SLAM2源码学习:Initializer.cc⑧: Initializer::CheckRT检验三角化结果

前言 ORB-SLAM2源码学习&#xff1a;Initializer.cc⑦: Initializer::Triangulate特征点对的三角化_cv::svd::compute-CSDN博客 经过上面的三角化我们成功得到了三维点&#xff0c;但是经过三角化成功的三维点并不一定是有效的&#xff0c;需要筛选才能作为初始化地图点。 …

macOS如何进入 Application Support 目录(cd: string not in pwd: Application)

错误信息 cd: string not in pwd: Application 表示在当前目录下找不到名为 Application Support 的目录。可能的原因如下&#xff1a; 拼写错误或路径错误&#xff1a;确保你输入的目录名称正确。目录名称是区分大小写的&#xff0c;因此请确保使用正确的大小写。正确的目录名…

记录一个连不上docker中的mysql的问题

引言 使用的debian12,不同发行版可能有些许差异&#xff0c;连接使用的工具是navicat lite 本来是毫无思绪的&#xff0c;以前在云服务器上可能是防火墙的问题&#xff0c;但是这个桌面环境我压根没有使用防火墙。 直到 ying192:~$ mysql -h127.0.0.1 -uroot ERROR 1045 (28…

Gradle自定义任务指南 —— 释放构建脚本的无限可能

文章目录 &#x1f50d;Gradle任务⚙️ 自定义任务的5大核心配置项1. 任务注册&#xff08;Registering Tasks&#xff09;2. group & description3. dependsOn4. inputs & outputs5. 类型化任务&#xff08;Task Types&#xff09; 任务常见配置参数传递方式1&#xf…

windows11关闭系统更新详细操作步骤

文章目录 1.打开注册表2.修改注册表内容2.1 新建文件2.2 修改值 3.修改设置 1.打开注册表 winR输入regedit(如下图所示) 2.修改注册表内容 进HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 2.1 新建文件 右侧界面右键即可 2.2 修改值 重命名为如下…

matlab绘图——彩色螺旋图

代码生成的图形是一个动态的彩色螺旋&#xff0c;展示了如何利用极坐标和颜色映射创建视觉吸引力强的图形。该图形可以用于数据可视化、艺术创作或数学演示&#xff0c;展示了 MATLAB 在图形处理方面的强大能力。通过调整 theta 和 r 的范围&#xff0c;可以创建出不同形状和复…

啥是EPS?

文章目录 1. 什么是EPS?2. 主要构成3. EPS的设计如何符合功能安全?4. 代表性的厂家1. 什么是EPS? EPS(Electric Power Steering,电动助力转向系统)是一种利用电动机提供转向助力的系统,取代了传统的液压助力转向系统(HPS)。EPS通过传感器检测驾驶员的转向意图,并由电…

QT:控件属性及常用控件(3)-----输入类控件(正则表达式)

输入类控件既可以进行显示&#xff0c;也能让用户输入一些内容&#xff01; 文章目录 1.Line Edit1.1 用户输入个人信息1.2 基于正则表达式的文本限制1.3 验证两次输入的密码是否一致1.4 让输入的密码可以被查看 2.Text Edit2.1 输入和显示同步2.1 其他信号出发情况 3.ComboBox…

24_游戏启动逻辑梳理总结

首先这个项目从游戏根入口GameRoot.cs的初始化开始 分为 服务层初始化Svc.cs 与 业务系统层初始化Sys.cs 而服务层 分为 资源加载服务层ResSvc.cs 与 音乐播放服务层AudioSvc.cs 而在 资源加载服务层ResSvc.cs中 初始化了 名字的 配置文件 而音乐播放服务层AudioSvc.cs 暂时没…

【25考研】中科院软件考研复试难度分析!

中科院软件复试不需要上机&#xff01;且对专业综合能力要求较高&#xff01;提醒同学一定要认真复习&#xff01; 一、复试内容 二、参考书目 官方并未明确给出&#xff0c;建议同学参考初试书目&#xff1a; 1&#xff09;《数据结构&#xff08;C语言版&#xff09;》严蔚…