C语言学习笔记之函数篇

        与数学意义上的函数不同,C语言中的函数又称为过程接口,具有极其重要的作用。教科书上将其定义为:程序中的子程序

        在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method,subprogram, callable unit),是一个大型程序中的某部分代码, 由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性

        (一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库)

目录

函数分类

自定义函数

库函数

函数的参数

实际参数(实参)

形式参数(形参)

函数的调用

传值调用

传址调用

嵌套调用

链式访问

函数递归

函数的定义与声明

函数的定义

函数的声明

重点:


函数分类

        C语言的函数分为两类,一类是自定义函数,另一类则是库函数

自定义函数

        顾名思义,自定义函数就是自己定义的函数,函数定义的语法规则如下:

ret_type fun_name(para1, *)
{statement;//语句项
}
ret_type 返回类型(可以是内置类型,也可以是自定义类型,无返回值时为void)
fun_name 函数名(命名规则同变量命名规则,建议采用规范的命名方法如:大驼峰命名法,下划线命名法)
para1   函数参数(数量不限,但是不建议太多)

有返回值有参数:

#include <stdio.h>int get_int_max(int a, int b)
{if (a > b)return a;elsereturn b;
}int main()
{int x = 0; int y = 0;scanf("%d%d", &x, &y);int max = get_int_max(x, y);printf("%d", max);return 0;
}

无返回值无参数:

#include <stdio.h>void print_hello()
{printf("hello!\n");
}int main()
{print_hello();return 0;
}

库函数

        在使用C语言编程时,几乎大量的用户都会使用某一个相同或者相似的功能,如:打印(printf),而每个人使用时都需要自己定义此功能模块,严重降低了编程的效率。为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。因此,对于库函数通俗的理解就是:别人已经替我们写好的,符合我们要求的,可以直接使用的函数(使用库函数必须包含对应的头文件)。(通过 www.cplusplus.com学习库函数,掌握学习库函数方法以及常用库函数即可)

        在日常工作生活中,库函数并不能满足我们的全部需求,因此总会需要我们自己去实现符合预期的功能和模块,这也是自定义函数存在的意义

库函数 strcpy 的学习和使用

#include <stdio.h>
#include <string.h>int main()
{char ch1[] = "hello world\n";char ch2[15];char* ch3 = strcpy(ch2, ch1);printf("%s%s%s", ch1, ch2, ch3);return 0;
}

函数的参数

实际参数(实参)

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

形式参数(形参)

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

        (形参是实参的一份临时拷贝)(形参和实参可以同名)

函数的调用

传值调用

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

#include <stdio.h>void modify_x(int x)
{x = 10;
}int main()
{int x = 0;modify_x(x);printf("%d\n", x);return 0;
}

传址调用

        传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
        这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量(这也是为什么使用scnaf函数传参时需要 & )。(指针篇中详解)

#include <stdio.h>void modify_x(int* x)
{*x = 10;
}int main()
{int x = 0;modify_x(&x);printf("%d\n", x);return 0;
}

嵌套调用

        函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。函数内调用其他函数称为嵌套调用。

#include <stdio.h>int add_x(int x, int y)
{return x + y;
}int mult_x(int x) // x*x
{int i = 0;int num = x;for (i = 0; i < x - 1; i++){num = add_x(num, x);}return num;
}int main()
{int x = 0;scanf("%d", &x);int ret = mult_x(x);printf("%d\n", ret);return 0;
}

链式访问

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

#include <stdio.h>int add_x(int x, int y)
{return x + y;
}int mult_x(int x) // x*x
{int i = 0;int num = x;for (i = 0; i < x - 1; i++){num = add_x(num, x);}return num;
}int main()
{int x = 0;scanf("%d", &x);printf("%d\n", mult_x(x)); //链式访问return 0;
}

函数递归

        程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
        递归的主要思考方式在于:把大事化小

        递归的两个必要条件(不满足则会出错):

        存在限制条件,当满足这个限制条件的时候,递归便不再继续。
        每次递归调用之后越来越接近这个限制条件。

#include <stdio.h>void print(int x)
{if (x / 10 > 0)print(x / 10);printf("%d ", x % 10);}int main()
{int num = 12345;print(num);return 0;
}

程序执行流程:

函数的定义与声明

函数的定义

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

函数的声明

        1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。

        2.编译器通过函数声明来寻找对应的函数。
        3. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
        4. 函数的声明一般要放在头文件中的。

void print(int x); // void print(int); (可以省略参数变量名,但不建议这么写)

重点:

        1.函数的定义也相当于一次声明,因此当我们的函数定义写在函数调用的前面(同一个文件)时不需要专门写声明也可以找到并调用函数。

        2.函数必须先声明后使用,否则编译器会找不到对应的函数而报错。

        3.C语言标准头文件中存放着标准库函数的声明,这也是为什么我们使用库函数时需要包含对应的头文件(C语言标准库文件中存放的是函数的具体实现细节即定义)。

        4.在实践中我们通常把函数的声明和定义分离,声明放到头文件中(.h后缀的文件),定义编译成二进制文件。目的:不想让别人清楚我们所实现的功能和模块的具体实现方法,只向外提供使用的接口和方法即声明和注释。

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

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

相关文章

React 入门使用 (官方文档向 Part2)

文章目录 用 State 响应输入声明式地考虑 UI步骤 1&#xff1a;定位组件中不同的视图状态步骤 2&#xff1a;确定是什么触发了这些状态的改变步骤 3&#xff1a;通过 useState 表示内存中的 state步骤 4&#xff1a;删除任何不必要的 state 变量步骤 5&#xff1a;连接事件处理…

059-第三代软件开发-巧用工控板LED指示灯引脚

第三代软件开发-巧用工控板LED指示灯引脚 文章目录 第三代软件开发-巧用工控板LED指示灯引脚项目介绍巧用工控板LED指示灯引脚第一种方式第二种方式 总结 关键字&#xff1a; Qt、 Qml、 Power、 继电器、 IO 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项…

video标签在h5中被劫持问题

将video的视频链接转为blob export const encryptionVideo (options: URL) > {return new Promise((resolve, reject) > {window.URL window.URL || window.webkitURL;var xhr new XMLHttpRequest();xhr.open(GET, options.url, true);xhr.responseType blob;xhr.onl…

圆通速递单号查询入口,以表格的形式导出详细物流信息

批量查询圆通速递单号的物流信息&#xff0c;并以表格的形式导出单号的详细物流信息。 所需工具&#xff1a; 一个【快递批量查询高手】软件 圆通速递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的伙伴记得先注册&…

C++初识类和对象

前言 上一期我们介绍了一些C入门的基础知识&#xff0c;本期我们来介绍面向对象。初步认识一下面向对象和面向过程、类、以及封装&#xff01; 本期内容介绍 面向过程和面向对象 类的引入 类的定义 类的访问限定符和封装 类的作用域 类的实例化 类对象模型 this指针 一、面向…

基本数据结构二叉树(1)

目录 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1概念 2.2现实中的二叉树&#xff1a; 2.3 特殊的二叉树&#xff1a; 2.5 二叉树的存储结构 2. 链式存…

【多线程】-- 03 龟兔赛跑案例线程创建方法之三:Callable接口

多线程 2 线程创建 【续】2.2 龟兔赛跑案例 首先需要一个赛道距离&#xff0c;然后会距离终点越来越近判断比赛是否结束打印出胜利者龟兔赛跑开始故事中是乌龟获胜&#xff0c;兔子需要睡觉&#xff0c;所以要模拟兔子睡觉最终&#xff0c;乌龟赢得比赛 package com.duo.de…

C语言数据类型和变量

# C语言数据类型和变量 # 数据类型介绍 C语⾔提供了丰富的数据类型来描述⽣活中的各种数据。使⽤整型类型来描述整数&#xff0c;使⽤字符类型来描述字符&#xff0c;使⽤浮点型类型来描述⼩数。所谓“类型”&#xff0c;就是相似的数据所拥有的共同特征&#xff0c;编译器只有…

MySQL进阶知识

目录 MySQL的Linux安装 存储引擎 MySQL的体系结构 存储引擎简介 存储引擎特点 InnoDB 逻辑存储结构 MyISAM Memory 对比 存储引擎选择 索引 介绍 索引结构 BTree索引 Hash索引 索引分类 索引语法 SQL性能分析 SQL执行频率 慢查询日志 profile详情 expla…

CRC 循环冗余检测

目录 一、基础知识1.异或运算xor2.模2算术&#xff08;1&#xff09;模2加法和减法&#xff08;2&#xff09;模2乘法&#xff08;3&#xff09;模2除法 二、CRC循环冗余检测1.背景2.原理3.求R 一、基础知识 1.异或运算xor 异或&#xff0c;顾名思义&#xff0c;只有当两个数…

最新AI创作系统ChatGPT网站运营源码、支持GPT-4-Turbo模型,图片对话识图理解,支持DALL-E3文生图

一、AI创作系统 SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01;本系统使用NestjsVueTypescript框架技术&#xff0c;持续集成AI能力到本系统。支持OpenAI DALL-E3文生图&#xff0c;…

事件委派+自定义属性+编程式导航实现路由跳转及传参

当我们页面中有许多a标签需要实现点击跳转到同一个页面并携带不同的参数时&#xff0c;我们就可以使用事件委派自定义属性编程式导航 的方式&#xff0c;用最小的内存实现路由跳转的最大效率。 为什么我们不用router-link 进行跳转&#xff1f; 要知道&#xff0c;我们页面中…

【单调栈】子数组的最小值之和

import java.util.Deque; import java.util.LinkedList;/** 参考链接&#xff1a;https://leetcode.cn/problems/sum-of-subarray-minimums/solutions/1930857/gong-xian-fa-dan-diao-zhan-san-chong-shi-gxa5/* https://leetcode.cn/problems/sum-of-subarray-minim…

论文公式和代码对应

NGCF 论文地址 NGCF模型全部代码 import torch import torch.nn as nn import torch.nn.functional as F class NGCF(nn.Module):def __init__(self, n_user, n_item, norm_adj, args):super(NGCF, self).__init__()self.n_user n_userself.n_item n_itemself.device args…

数据结构与算法(Java)-树形DP题单

树形DP&#xff08;灵神笔记&#xff09; 543 二叉树的直径 543. 二叉树的直径 - 力扣&#xff08;LeetCode&#xff09; 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根…

使用 Java 客户端通过 HTTPS 连接到 Easysearch

Easysearch 一直致力于提高易用性&#xff0c;这也是我们的核心宗旨&#xff0c;然而之前一直没有官方的 Java 客户端&#xff0c;也对用户使用造成了一些困扰&#xff0c;现在&#xff0c;我们正式发布了第一个 Java 客户端 Easysearch-client:1.0.1。 这一里程碑式的更新为开…

成为AI产品经理——TPR、FPR、ROC、AUC

目录 一、PR图、BEP 1.PR图 2.BEP 二、灵敏度、特异度 1.灵敏度 2.特异度 三、真正率、假正率 1.真正率 2.假正率 三、ROC、AUC 1.ROC 2.AUC 四、KS值 一、PR图、BEP 1.PR图 二分类问题模型通常输出的是一个概率值&#xff0c;我们需要设定一个阈值&#xff…

Android aidl的简单使用

一.服务端 1.创建aidl文件&#xff0c;然后记得build下生成java文件 package com.example.aidlservice31;// Declare any non-default types here with import statementsinterface IMyAidlServer {// 接收一个字符串参数void setData(String value);// 返回一个字符串String …

简单订单和支付业务的相关流程

1、订单创建、支付及订单处理流程图 2、创建HTTP客户端工具类 Slf4j public class HttpclientUtil {//类中定义了一个私有静态成员变量instance&#xff0c;并且将其初始化为HttpclientUtil类的一个实例&#xff0c;用于实现单例模式。private static HttpclientUtil instance…

单片机学习6——定时器/计数功能的概念

在8051单片机中有两个定时器/计数器&#xff0c;分别是定时器/计数器0和定时器/计数器1。 T/C0: 定时器/计数器0 T/C1: 定时器/计数器1 T0: 定时器0 T1: 定时器1 C0: 计数器0 C1: 计数器1 如果是对内部振荡源12分频的脉冲信号进行计数&#xff0c;对每个机器周期计数&am…