五:函数基础:概念、基础语法、库函数与自定义函数

news2025/1/16 7:56:47

本章学习链接如下: 

 

1.函数的概念


函数是执行特定任务的自包含代码块,它可以接受输入,处理输入,并产生输出。函数的使用提高了代码的重用性、模块性和可读性。C语言中的函数可以分为两大类:库函数和用户定义函数。

2.函数基础语法

函数的定义通常包括四个主要部分:返回类型、函数名、参数列表(可选)和函数体。 

返回类型 函数名(参数类型 参数名, ...) {
    // 函数体
    // 返回值(如果有的话)
}

(1)无返回值,无参数的函数

void sayHello() {
    printf("Hello, World!\n");
}

(2)有返回值,有参数的函数

int add(int a, int b) {
    return a + b;
}

(3)调用函数

在C语言中,调用函数时需要提供函数名和必要的参数(如果函数接受参数的话)。

sayHello(); // 调用无参数的函数

int result = add(5, 3); // 调用有参数的函数,并接收返回值

(4)参数传递

C语言支持两种参数传递方式:

  • 按值传递:函数接收参数值的副本,对参数的修改不会影响原始数据。
  • 按引用传递:通过传递参数的地址(通常使用指针),函数可以直接修改原始数据。

3.函数分类

根据返回值和参数的不同,函数可以进一步分类:

  1. 根据返回值

    • 有返回值函数:这类函数执行完毕后会返回一个值。返回值可以是intfloatcharvoid*等类型。
    • 无返回值函数:使用void关键字定义,不返回任何值。
  2. 根据参数

    • 有参数函数:这类函数在定义时指定了一个或多个参数,调用时需要提供相应的实际参数。
    • 无参数函数:这类函数在定义和调用时都不使用参数。

4.函数的作用

  • 模块化:函数允许将程序分解为小的、管理得当的部分,从而提高程序的模块性。
  • 重用性:一旦定义了一个函数,就可以在程序的多个位置多次调用它,提高代码的重用性。
  • 易于维护:函数帮助将复杂的问题分解为简单的子问题,使代码更易于理解和维护。

 

5.库函数

 库函数的学习和查看⼯具很多,⽐如: C 标准库头文件 - cppreference.com

 

这些是C标准库提供的函数,如printf()scanf()strcpy()等,可以直接在程序中调用,无需用户自己定义。库函数是预先编写好的、可执行特定任务的函数集合,它们被编译并打包在标准库或其他库中。用户可以通过包含相应的头文件并在程序中调用这些函数来使用它们,无需自己重新编写这些功能的代码。头文件包含了库函数的声明、宏定义、类型定义等,是使用库函数的关键。

库函数提供了执行常见任务的预编写代码,例如输入输出操作、字符串处理、数学计算等。C标准库(libc)是最基本的库,包含了语言核心的功能,如标准输入输出(stdio)、字符串操作(string)、数学运算(math)等。 

使用库函数的步骤

  1. 包含头文件:在源代码文件的顶部包含一个或多个头文件,这些头文件声明了你打算使用的库函数。例如,使用printfscanf函数需要包含头文件<stdio.h>
  2. 调用函数:在程序中按需调用库函数。调用时需确保传递正确的参数,并接收函数返回的任何值(如果有的话)。

头文件

头文件是扩展名为.h的文件,包含了C程序中可重用的声明和宏定义。头文件让我们能够将声明集中在一个地方,并在多个源文件之间共享。包含头文件主要有两个目的:

  1. 声明函数和变量:头文件中声明的函数和变量可以在包含了该头文件的源文件中使用。
  2. 引入宏定义和类型定义:头文件可以包含宏定义和类型定义,以便在多个源文件中复用。

 使用头文件的语法

#include <头文件名>

或者,如果是自定义的头文件,可以使用双引号:

#include "头文件名"
#include <stdio.h>  // 包含标准输入输出头文件
#include <math.h>   // 包含数学库头文件

int main() {
    printf("Square root of 4 is: %f\n", sqrt(4));  // 调用 sqrt 函数计算 4 的平方根
    return 0;
}

 在这个示例中,<stdio.h>头文件声明了printf函数,用于输出;<math.h>头文件声明了sqrt函数,用于计算平方根。

6.用户自定义函数

这些是程序员根据需要自己定义的函数,以执行特定的任务。

函数的形参(形式参数)、实参(实际参数)、以及return语句是至关重要的。这些构成了函数调用和定义的基础,使得代码能模块化和重用。

(1)形参和实参

形参是在函数定义时指定的参数,它们作为占位符存在(需要用到这个函数的时候可以按需传入实际值),在函数被调用时接收实际的参数值。形参只在函数内部可见,并且其作用域仅限于函数体内。

实参是在调用函数时传递给函数的实际值,这些值将赋给对应的形参。

形参与实参之间的关系:当函数被调用时,每个实参的值会被复制给对应的形参。这种参数传递方式称为“按值传递”,意味着对形参的任何操作都不会影响实参的值。如下面这个示例所示:在这个例子中,xyadd函数的形参,而ab 是调用add函数时的实参。a 的值被复制给了 xb 的值被复制给了 y,因此在add函数内部对xy的操作不会影响ab的值。

#include <stdio.h>

// 定义一个函数,它的形参是 x 和 y
int add(int x, int y) {
    return x + y; // 返回 x 和 y 的和
}

int main() {
    int a = 5, b = 3;
    // 调用 add 函数,此时 a 和 b 是实参
    int sum = add(a, b);
    printf("The sum is: %d\n", sum);
    return 0;
}

(2)return语句

return 语句用于从函数返回一个值到调用者。一个函数可以有多个return语句,但只要执行到任何一个return语句,函数就会结束执行并返回指定的值。

如果函数的返回类型为void,则return语句可以省略,或者单独写作return;,表示函数到此结束执行并返回调用者。

如果函数中存在if等分⽀的语句,则要保证每种情况下都有return返回,否则会出现编译错误。

如下示例:numisPositive函数的形参,而number是调用该函数时的实参。isPositive函数通过return语句返回一个整数,表示给定的数是否为正数。

#include <stdio.h>

// 定义一个函数,用于判断一个数是否为正数
// 这里的形参是 num
int isPositive(int num) {
    if (num > 0) {
        return 1; // 如果 num 是正数,返回 1
    } else {
        return 0; // 否则,返回 0
    }
}

int main() {
    int number = -5;
    // 调用 isPositive 函数,number 是实参
    if (isPositive(number)) {
        printf("%d is positive.\n", number);
    } else {
        printf("%d is not positive.\n", number);
    }
    return 0;
}

 

 

 

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

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

相关文章

为什么程序员老婆都很漂亮?网友:new出来的。。。

最近&#xff0c;我被一个问题吸引了&#xff0c;一网友提问&#xff1a;“为何程序员老婆都很漂亮&#xff1f;”哈哈&#xff0c;说到这个话题&#xff0c;我瞬间就不困了。 评论区的网友们也非常来劲儿。有位网友打趣说&#xff1a;“因为是自己用代码new出来的&#xff0c;…

换换换 码题集

难度:钻石 时间限制:1秒 占用内存:128M 输入 5 5 5 car van track dog cat 1 2 4 5 3 2 5 1 1 4 van car track dog cat 输出 5 3 2 4 1 原始思路&#xff1a;for循环&#xff0c;但会运行超时 #include<bits/stdc.h> using namespace std; int main(){int n,m,t;cin…

校园论坛系统

文章目录 校园论坛系统一、项目演示二、项目介绍三、10000字论文参考四、系统部分功能截图五、部分代码展示六、底部获取项目和10000字论文参考&#xff08;9.9&#xffe5;&#xff09; 校园论坛系统 一、项目演示 校园论坛系统 二、项目介绍 基于springbootvue的前后端分离…

网上一个叫阳哥的网红分享的人力RPO项目靠谱吗?

在抖音平台上&#xff0c;阳哥以其专业的知识和独到的见解&#xff0c;吸引了大量粉丝的关注。最近&#xff0c;他分享的人力RPO项目更是引起了广泛关注。那么&#xff0c;阳哥介绍的这个人力RPO项目到底靠不靠谱呢?本文将从四个方面进行分析和佐证。 首先&#xff0c;阳哥作为…

ARM/X86+FPGA轨道交通/工程车辆行业的解决方案

深圳推出首条无人驾驶地铁—深圳地铁20号线&#xff0c;可以说是深圳地铁的一次开创性的突破。智能交通不断突破的背后&#xff0c;需要很严格的硬件软件等控制系 统&#xff1b;地铁无人驾驶意味着信号系统、通信系统、综合监控系统、站台屏蔽门工程等项目必须严格执行验收。…

路由器端口映射是什么意思?

路由器端口映射是一种网络配置技术&#xff0c;在私有网络中允许外部网络访问特定的服务或应用程序。通过将路由器的端口映射到内部客户端设备&#xff0c;可以实现从公共网络访问内部网络资源的目的。 天联组网介绍 天联是一款异地组网内网穿透产品&#xff0c;由北京金万维科…

【全网最详细】如何保证缓存和数据库一致性

如何保证缓存和数据库一致性&#xff0c;这是一个老生常谈的话题了。 但很多人对这个问题&#xff0c;依旧有很多疑惑&#xff1a; 到底是更新缓存还是删缓存&#xff1f;到底选择先更新数据库&#xff0c;再删除缓存&#xff0c;还是先删除缓存&#xff0c;再更新数据库&…

【灵境矩阵】零代码创建AI智能体之行业词句助手

欢迎来到《小5讲堂》 这是《灵境矩阵》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 创建智能体选择创建方式零代码 基础配置头像名称简介指令开场白…

【Vue3进阶】- 第2学堂小商城项目后端准备和接口文档

简介 在大多数前端项目开发中&#xff0c;都需要与后端进行接口交互&#xff0c;后端通常会以文档的形式提供接口信息&#xff0c;前端开发者通过阅读这些文档&#xff0c;了解后端接口的功能和使用方法&#xff0c;从而实现数据的获取和提交等功能。 第二学堂小商城教程后端…

Vue3 之 JsBarcode打印条形码

一、前情提要 1. 需求 根据商品sku打印出条形码&#xff0c;贴在商品盒上 2. 效果 二、使用前准备 1. 下载 JsBarcode npm install jsbarcode --save 2. 配置项 3. 封装 import jsbarcode from jsbarcodeexport default function renderBarcode(el: HTMLElement, value: s…

洛谷【入门2】分支结构——python题解

洛谷【入门2】分支结构——python题解 【深基1-2】小学数学 N 合一题目描述问题 1问题 2问题 3问题 4问题 5问题 6问题 7问题 8问题 9问题 10问题 11问题 12问题 13问题 14 输入格式输出格式样例 #1样例输入 #1样例输出 #1 【深基2.习6】Apples Prologue / 苹果和虫子题目描述输…

即插即用模块之DO-Conv(深度过度参数化卷积层)详解

目录 一、摘要 二、核心创新点 三、代码详解 四、实验结果 4.1Image Classification 4.2Semantic Segmentation 4.3Object Detection 五、总结 论文&#xff1a;DOConv论文 代码&#xff1a;DOConv代码 一、摘要 卷积层是卷积神经网络(cnn)的核心组成部分。在本文中…

外贸开发信必知技巧:高回复率不再是梦

外贸行业在Zoho的客户群体中占比较高。因为我们的国际化背景、丰富的产品组合、多语言多币种跨时区、高性价比等特点&#xff0c;成为外贸企业开展业务的选择。在和外贸客户沟通中&#xff0c;发现无论是外贸大拿还是新手小白&#xff0c;大家遇到一个共同的问题——发出去的开…

动态规划在矩阵链乘法中的应用:寻找最优括号化方案

动态规划在矩阵链乘法中的应用&#xff1a;寻找最优括号化方案 一、问题描述二、动态规划的基本概念三、矩阵链乘法问题的动态规划解法四、伪代码五、C语言代码示例六、计算括号化方案的数量七、结论 计算括号化方案的数量问题是计算机科学中的一个经典问题&#xff0c;它涉及到…

K8S node节点执行kubectl get pods报错

第一个问题是由第二个问题产生的&#xff0c;第二个问题也是最常见的 网上找的都是从master节点把文件复制过来&#xff0c;这样确实可以解决&#xff0c;但是麻烦&#xff0c;有一个node节点还好&#xff0c;如果有多个呢&#xff1f;每个都复制吗&#xff1f;下面是我从外网…

为什么要“挺”鸿蒙?

鸿蒙到底是什么&#xff1f; 随着5G、物联网等技术的快速发展&#xff0c;智能终端设备的应用场景也越来越广泛。为了满足不同设备间的互联互通需求&#xff0c;华为在2019年推出了自主研发的操作系统——鸿蒙OS。值得关注的是&#xff0c;这也是首款国产操作系统。 要了解鸿…

密码学 | 椭圆曲线 ECC 密码学入门(三)

目录 7 这一切意味着什么&#xff1f; 8 椭圆曲线密码学的应用 9 椭圆曲线密码学的缺点 10 展望未来 ⚠️ 原文地址&#xff1a;A (Relatively Easy To Understand) Primer on Elliptic Curve Cryptography ⚠️ 写在前面&#xff1a;本文属搬运博客&#xff0c;自己留…

YOLOv8草莓生长状态(灰叶病缺钙需要肥料)检测系统(python开发,带有训练模型,可以重新训练,并有Pyqt5界面可视化)

本次检测系统&#xff0c;不仅可以检测图片、视频或摄像头当中出现的草莓叶子是否有灰叶病&#xff0c;还可以检测出草莓叶是否缺钙、是否需要施肥等状态。基于最新的YOLO-v8训练的草莓生长状态检测模型和完整的python代码以及草莓的训练数据&#xff0c;下载后即可运行&#x…

CentOS7安装MySQL8.0教程

环境介绍 操作系统&#xff1a;Centos7.6 MySQL版本&#xff1a; 8.0.27 只要是8.0.*版本&#xff0c;那就可以按照本文说明安装 一、安装前准备 1、卸载MariaDB 安装MySQL的话会和MariaDB的文件冲突&#xff0c;所以需要先卸载掉MariaDB。 1.1、查看是否安装mariadb rpm -…

如何在Windows通过固定tcp公网地址ssh远程访问本地Kali Linux

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 本文主要介绍如何在Kali系统编辑SSH配置文件并结合cpolar内网穿透软件&#xff0c;实现公网环境ssh远程连接本地kali系统。 1. 启…